最近在项目中尝试去监听屏幕的开与关。唰唰唰在脑子里面就有了一个实现的思路:
Intent.ACTION_SCREEN_ON
//android.intent.action.SCREEN_ON
//屏幕亮起事件,从api-1有的
Intent.ACTION_SCREEN_OFF
//android.intent.action.SCREEN_OFF
//屏幕关闭事件,从api-1有的
Intent.ACTION_USER_PRESENT
//android.intent.action.USER_PRESENT
//用户解锁屏幕事件,从api-3有的(现在3以下应该没有谁还在做兼容了吧?)
第二个任务时想到用户不知道何时去开关屏幕,所以第一个想到的是直接去manifest中去注册我们的广播类。
然后一运行,开关屏幕,咦?怎么没有SCREEN_OFF,SCREEN_ON出来?只有在解锁屏幕时有USER_PRESENT事件出来!!!我反复检查了三次,一个字一个字对了下action,发现也没有错误 。于是赶紧上个google 问问是个啥情况 ?
不问不知道,一问吓一跳,原来SCREEN_OFF,SCREEN_ON不支持在manifest中去定义。必需使用动态注册方式。
这下杯具了,为了能使得监听任何时候都起作用,只能再定义一个服务(service)一直在后台运行着,然后再注册个广播去监听开关屏幕事件了。
无耐,只能再定义一个服务了:
public class CheckService extends Service{
public static final String ACTION_CHECK = "com.krislq.screenon.service.CHECK";
private ScreenReceiver mScreenReceiver;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
log("onCreate");
super.onCreate();
mScreenReceiver = new ScreenReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_USER_PRESENT);
registerReceiver(mScreenReceiver, filter);
}
public void log(String msg) {
if(TextUtils.isEmpty(msg)) {
return;
}
Log.e("CheckService", msg);
}
@Override
public void onDestroy() {
log("onDestroy");
unregisterReceiver(mScreenReceiver);
super.onDestroy();
}
}
OK .好了,运行下,可以正常运行了。
源码来了。小demo .
点击下载 ScreenOn Demo