好久没有写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. 《Java核心技术 卷II 高级特性(原书第9版)》

    <Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...

  2. PHP命名空间学习笔记

    命名空间的支持版本:PHP 5 > 5.3.0,PHP 7 . 什么是命名空间 从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件 ...

  3. 分布式缓存系统Memcached在Asp.net下的应用

    Memcached 是一个高性能的分布式内存对象缓存系统.用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来降低读取数据库的次数,从而提高动态.数据库驱动站点的速度. Memcache ...

  4. 我所遭遇过的中间件--3D MAX SDK

    搞图形的人都知道3D MAX,而3D MAX SDK就是在该软件基础上的一套软件开发包.至于该不该将3D MAX SDK归纳为中间件,不要在意这细节了,反正我觉得SDK和中间件就差不多是一个东西.实际 ...

  5. iOS开发-沙盒(sandbox)机制

    苹果前天发的财报,貌似现在用ios系统的比以前又多了一些,但是大家的iPhone购买的渠道也是五花八门,有的从非正规渠道购买的iPhone里的操作系统已经被越狱过,越狱这个事情和Android的roo ...

  6. 以太网帧、IP报文格式

    这几天完成一个对比以太网帧的程序(c语言),老师给了以太网帧头部和IP报文头部的结构体,跟实际抓取到的数据包的格式是相同的. 以太网帧头部的数据结构: typedef struct { unsigne ...

  7. textarea光标移到末尾兼容ie,ffchrome

    function moveEnd(obj){         obj.focus();         var len = obj.value.length;         if (document ...

  8. 翻译记忆软件-塔多思TRADOS经典教程_1

    窗体顶端 网络上关于TRADOS使用的文章很多,但大多数内容涉及的内容都过于广泛,刚准备上手的同行们看了总会觉得不知所云,无从下手.笔者自己也在自学阶段遇到不少麻烦.经过长期的使用和琢磨,终于写了短文 ...

  9. AsyncTask 和 Thread 区别

    一.AsyncTask是封装好的线程池,比起Thread+Handler的方式,AsyncTask在操作UI线程上更方便,因为onPreExecute().onPostExecute()及更新UI方法 ...

  10. java实现内部排序算法

    冒泡排序 public class BubbleSort{ public static int[] asc(int[] a){ int item; for (int i = 0; i < a.l ...