BroadcastReceiver之实现锁屏、解锁样例
好久没有写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
- private BroadcastReceiver mScreenFilterReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
- //做要求的处理
- }else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
- }
- }
- };
2.在Service的onCreate中定义IntentFilter及注冊receiver
- IntentFilter ScreenFilter = new IntentFilter();
- ScreenFilter.addAction(Intent.ACTION_SCREEN_ON);
- ScreenFilter.addAction(Intent.ACTION_SCREEN_OFF);
- registerReceiver(mScreenFilterReceiver, ScreenFilter);
3.在Service的onDestroy中要反注冊这个receiver。
- unregisterReceiver(mScreenFilterReceiver);
BroadcastReceiver之实现锁屏、解锁样例的更多相关文章
- android开发 锁屏 真正的锁屏,是go锁屏那种。
想做个锁屏界面很久了,最近一周,历经千辛万苦,越过种种挫折,终于完美实现了这一要求,在此将锁屏思路分享出来. 注意:这不是什么一键锁屏,是类似“go锁屏”那样的锁屏界面. 准备:本程序共需要 两个ac ...
- Appium 解决锁屏截屏问题(java篇)
今天有个小伙伴问我,怎么把锁屏进行解锁操作? A.思路在初始化driver后,加入等待判断是否有锁屏(元素)(记得要加入等待) B.如果有就进行解锁,就一般的输入数字密码然后进行解锁(当然了你要知 ...
- 【Mac使用系列】Mac锁屏及快捷键
mac锁屏办法,我有所尝试,可用系统自带锁屏快捷键:Ctrl + Command + Q或者参考方法2,直接设置TouchBar. 这两种办法,亲测可用.我直接设置了TouchBar,锁屏解锁离得很近 ...
- [每日app二]月入60万多嘛?单词锁屏的潜力!
抢了用户的时间,就是抢了用户的金钱! 单词锁屏,一个开发难度不太大,但仅仅360手机助手下载就是每周4万!拉风- 对于搞app的同学来说,搞个锁屏,还不是玩似的,但是要定位好,玩得好,那就有难度了.最 ...
- BroadcastReceiver之(手动代码注册广播)屏幕锁屏、解锁监听、开机自启
对于解锁和锁屏这种用的比较频繁action,谷歌做了限制,必须手动用代码注册 直接上代码:这是注册广播(手动代码注册广播接收者) public class MainActivity extends A ...
- Android 监听锁屏、解锁、开屏 操作
1.首先定义 ScreenListener package com.app.lib; import android.content.BroadcastReceiver; import android ...
- Android 监听屏幕锁屏,用户解锁
在做一个程序的时候,需要时刻保持某一服务是启动的,因此想到了通过监听屏幕SCREEN_ON和SCREEN_OFF这两个action.奇怪的是,这两个action只能通过代码的形式注册,才能被监听到,使 ...
- Android 监听屏幕锁屏&用户解锁
在做视频播放器的时候,遇到一个问题,在用户播放视频然后锁屏之后,视频播放器仍然在继续播放,遇到类似手机系统状态改变的问题的时候,首先想到了广播,下面做个总结: public class ScreenL ...
- 使用恶意USB设备解锁 Windows & Mac 锁屏状态
NSA专业物理入侵设备——USB Armory,可解锁任意锁屏状态的下的Windows和Mac操作系统,含最新发布的Windows10.及较早的Mac OSX El Capitan / Maveric ...
随机推荐
- Android 系统服务一览表
在<Zygote进程[3]--SystemServer的诞生>一文中介绍了SystemServer的诞生,本文来看一下SystemServer中初始化的系统服务. 1.AccountMan ...
- 如何使用C++回调函数
程序猿经常须要实现回调.本文将讨论函数指针的基本原则并说明怎样使用函数指针实现回调.注意这里针对的是普通的函数,不包含全然依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论). ...
- cocos2d js ScrollView的使用方法
游戏中非常多须要用到ScrollView的情况,也就是须要滚动一片区域. 这里有两种实现方法,一种是使用cocos studio的方式,另外一种是手写代码.先看第一种 第一种记得在设置滚动区域时选取裁 ...
- 在Spark上运行WordCount程序
1.编写程序代码如下: Wordcount.scala package Wordcount import org.apache.spark.SparkConf import org.apache.sp ...
- Rabbit MQ UI 重置 用户名 密码
新增admin用户 rabbitmqctl add_user newadmin s0m3p4ssw0rd rabbitmqctl set_user_tags newadmin administrato ...
- Java基础(九):抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象之外, ...
- STL sort 函数实现详解 ZZ
前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不对劲,知道自己回答错了.这几天特意看了一下,在 ...
- .NET-"/"应用程序中的服务器错误
当出现这个问题的时候,就在web.config文件中加上代码:<customErrors mode="Off"/> 然后重新访问站点就能看到问题所在了,例如我的错误显示 ...
- (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)
NGUI系列教程七(序列帧动画) 今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...
- CPC广告反作弊
原文:http://blog.csdn.net/xwm1000/article/details/45460957 CPC广告上线也2年了,从上线以来就一直存在着作弊和反作弊的斗争,刚开始的时候流量少, ...
