好久没有写android的小样例了,因为前几天写了一篇关于Intent.Action的文章(http://blog.csdn.net/ljphhj/article/details/38796739)。有朋友私信问我关于ACTION_SCREEN_ON和ACTION_SCREEN_OFF还有ACTION_USER_PRESENT三个Action的使用方法,因为作为一个总结博文,当时并没有具体讲,ACTION_SCREEN_ON和ACTION_SCREEN_OFF仅仅能通过动态注冊的方式(代码内context.register和unregister)。而ACTION_USER_PRESENT则是动态、静态注冊两种方式都能够。

以下我们通过这个锁屏、解锁相关的BroadcastReceiver来了解一下。

package cn.panghu.activitys;

import com.example.broadcastsappdemo.R;

import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast; public class ScreenLockedActivity extends Activity{
private ScreenBroadcastReceiver screenBroadcastReceiver = null;
private Context context = null;
private Button lockedScreenBtn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getApplicationContext();
setContentView(R.layout.screen_lock_layout);
} @Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume(); //注冊这个广播
registerScreenBroadcastReceiver();
} private void registerScreenBroadcastReceiver() {
screenBroadcastReceiver = new ScreenBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//当屏幕锁屏的时候触发
intentFilter.addAction(Intent.ACTION_SCREEN_ON);//当屏幕解锁的时候触发
intentFilter.addAction(Intent.ACTION_USER_PRESENT);//当用户又一次唤醒手持设备时触发
context.registerReceiver(screenBroadcastReceiver, intentFilter);
Log.i("screenBR", "screenBroadcastReceiver注冊了");
}
//重写广播
class ScreenBroadcastReceiver extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
String strAction = intent.getAction();
if (Intent.ACTION_SCREEN_OFF.equals(strAction)){
//屏幕锁屏
Log.i("screenBR", "屏幕锁屏:ACTION_SCREEN_OFF触发");
Toast.makeText(context, "锁屏了", Toast.LENGTH_SHORT).show();
}else if (Intent.ACTION_SCREEN_ON.equals(strAction)){
//屏幕解锁(实际測试效果,不能用这个来推断解锁屏幕事件)
//【因为这个是解锁的时候触发。而解锁的时候广播还未注冊】
Log.i("screenBR", "屏幕解锁:ACTION_SCREEN_ON触发");
Toast.makeText(context, "解锁了", Toast.LENGTH_SHORT).show();
}else if (Intent.ACTION_USER_PRESENT.equals(strAction)){
//屏幕解锁(该Action能够通过静态注冊的方法注冊)
//在解锁之后触发的,广播已注冊
Log.i("screenBR", "屏幕解锁:ACTION_USER_PRESENT触发");
Toast.makeText(context, "解锁了", Toast.LENGTH_SHORT).show();
}else{
//nothing
}
} }
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
context.unregisterReceiver(screenBroadcastReceiver);
Log.i("screenBR", "screenBroadcastReceiver取消注冊了");
}
}

LogCat结果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGpwaGhq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

因为是静态注冊的方式,所以大家可能会认为那我要怎么让它长久地监听这锁屏、解锁屏幕的广播呢?

首先我们再次强调ACTION_SCREEN_ON和ACTION_SCREEN_OFF仅仅能通过动态注冊的方式(代码内context.register和unregister),而ACTION_USER_PRESENT则是动态、静态注冊两种方式都能够。

那么我们的突破口便是:我们能够动态地注冊一个关于屏幕解锁后(ACTION_USER_PRESENT)的广播者。而且在这个广播的onReceive方法中实现我们要做的一些操作。

比如我们能够开启一个Service服务。用于注冊我们所想要的这个Broadcast Receiver

1.在Service中定义receiver

  1. private BroadcastReceiver mScreenFilterReceiver = new BroadcastReceiver() {
  2. public void onReceive(Context context, Intent intent) {
  3. if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
  4. //做要求的处理
  5. }else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
  6. }
  7. }
  8. };

2.在Service的onCreate中定义IntentFilter及注冊receiver

  1. IntentFilter ScreenFilter = new IntentFilter();
  2. ScreenFilter.addAction(Intent.ACTION_SCREEN_ON);
  3. ScreenFilter.addAction(Intent.ACTION_SCREEN_OFF);
  4. registerReceiver(mScreenFilterReceiver, ScreenFilter);

3.在Service的onDestroy中要反注冊这个receiver。

  1. unregisterReceiver(mScreenFilterReceiver);

BroadcastReceiver之实现锁屏、解锁样例的更多相关文章

  1. android开发 锁屏 真正的锁屏,是go锁屏那种。

    想做个锁屏界面很久了,最近一周,历经千辛万苦,越过种种挫折,终于完美实现了这一要求,在此将锁屏思路分享出来. 注意:这不是什么一键锁屏,是类似“go锁屏”那样的锁屏界面. 准备:本程序共需要 两个ac ...

  2. Appium 解决锁屏截屏问题(java篇)

    今天有个小伙伴问我,怎么把锁屏进行解锁操作?   A.思路在初始化driver后,加入等待判断是否有锁屏(元素)(记得要加入等待) B.如果有就进行解锁,就一般的输入数字密码然后进行解锁(当然了你要知 ...

  3. 【Mac使用系列】Mac锁屏及快捷键

    mac锁屏办法,我有所尝试,可用系统自带锁屏快捷键:Ctrl + Command + Q或者参考方法2,直接设置TouchBar. 这两种办法,亲测可用.我直接设置了TouchBar,锁屏解锁离得很近 ...

  4. [每日app二]月入60万多嘛?单词锁屏的潜力!

    抢了用户的时间,就是抢了用户的金钱! 单词锁屏,一个开发难度不太大,但仅仅360手机助手下载就是每周4万!拉风- 对于搞app的同学来说,搞个锁屏,还不是玩似的,但是要定位好,玩得好,那就有难度了.最 ...

  5. BroadcastReceiver之(手动代码注册广播)屏幕锁屏、解锁监听、开机自启

    对于解锁和锁屏这种用的比较频繁action,谷歌做了限制,必须手动用代码注册 直接上代码:这是注册广播(手动代码注册广播接收者) public class MainActivity extends A ...

  6. Android 监听锁屏、解锁、开屏 操作

    1.首先定义 ScreenListener  package com.app.lib; import android.content.BroadcastReceiver; import android ...

  7. Android 监听屏幕锁屏,用户解锁

    在做一个程序的时候,需要时刻保持某一服务是启动的,因此想到了通过监听屏幕SCREEN_ON和SCREEN_OFF这两个action.奇怪的是,这两个action只能通过代码的形式注册,才能被监听到,使 ...

  8. Android 监听屏幕锁屏&用户解锁

    在做视频播放器的时候,遇到一个问题,在用户播放视频然后锁屏之后,视频播放器仍然在继续播放,遇到类似手机系统状态改变的问题的时候,首先想到了广播,下面做个总结: public class ScreenL ...

  9. 使用恶意USB设备解锁 Windows & Mac 锁屏状态

    NSA专业物理入侵设备——USB Armory,可解锁任意锁屏状态的下的Windows和Mac操作系统,含最新发布的Windows10.及较早的Mac OSX El Capitan / Maveric ...

随机推荐

  1. andriod 播放mp4

    权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> activi ...

  2. ExtJs动态生成复选框

    var old_value = Ext.get("fgzr_select").getValue() if(old_value == ""){ document. ...

  3. EF实体框架处理实体之间关联关系与EF延迟机制(下)

    在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...

  4. SCRUM黑

    来自 :coolshell 这篇文章的原文在这里(原文链接)(下文不是全译,也不是部分译,我只是把其总结,有我自己的发挥,但是原意大致不变),这篇文章完全是在调侃Scrum的,作者第一段就是一个免费声 ...

  5. coursera课程Text Retrieval and Search Engines之Week 2 Overview

    Week 2 OverviewHelp Center Week 2 On this page: Instructional Activities Time Goals and Objectives K ...

  6. 特殊汉字“𣸭”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;

    字符集.字符序的概念与联系 在数据的存储上,MySQL提供了不同的字符集支持.而在数据的对比操作上,则提供了不同的字符序支持. MySQL提供了不同级别的设置,包括server级.database级. ...

  7. 23.读写锁ReadWriteLock

    ReentrantReadWriteLock     所谓的读写锁,是访问资源共享共享锁.互斥锁,如果对资源加了写锁,其他线程无法获取写锁与读锁,但是持有写锁的线程,可以对资源     加读锁:如果一 ...

  8. iOS:步进UIStepper、滑动块UISlider、开关UISwitch的基本使用

    步进UIStepper.滑动块UISlider:当它们作为事件,被触发时,它们的值会发生改变.正因为如此,触发该事件时,可以一张一张翻阅浏览图片,,,, 步进UIStepper: @property( ...

  9. 混沌数学之Baker模型

    相关DEMO参见:混沌数学之离散点集图形DEMO 相关代码: // http://wenku.baidu.com/view/ac9b57ea172ded630b1cb65b.html class Ba ...

  10. 附3 springboot源码解析 - 构建SpringApplication

    package com.microservice.framework; import org.springframework.boot.SpringApplication; import org.sp ...