不能静态注册的广播:

android.intent.action.SCREEN_ON

android.intent.action.SCREEN_OFF

android.intent.action.BATTERY_CHANGED

android.intent.action.CONFIGURATION_CHANGED

android.intent.action.TIME_TICK

原因:

有以下几种说法,提供给大家参考:

1.提高系统效率:这两个事件是android的基本事件,如果大多数程序监听,会大大的拖慢整个系统,所以android不鼓励我们在后台监听这两个事件。

2.因为有序广播的优先级问题。以上这些广播中,静态注册时,系统的优先级大于应用,并且系统阻止了广播的向下传播。又因在Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的。故用动态注册代替静态注册。

3.系统安全问题。

解决方式(以android.intent.action.SCREEN_ON为例):

动态注册不能放到activity中,因为动态注册必须要在activity消亡的时候调用unregisterReceiver,会随着activity的解锁消失而不能再接收广播。一般的办法是在activity起来后马上start一个service,这个service里动态注册一个broadcastreceiver,broadcastreceiver里接收到SCREEN_ON消息后启动锁屏activitty为了保证broadcastreceiver任何时候都可以接收到SCREEN_ON,service必须常驻在系统内,所以要接收开机消息android.intent.action.BOOT_COMPLETED。

源代码:

public void onCreate(){

super.onCreate();

zdLockIntent = new Intent(ZdLockService.this , MainActivity.class);

zdLockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

/*注册广播*/

IntentFilter mScreenOnFilter = new IntentFilter("android.intent.action.SCREEN_ON");

ZdLockService.this.registerReceiver(mScreenOnReceiver, mScreenOnFilter);

/*注册广播*/

IntentFilter mScreenOffFilter = new IntentFilter("android.intent.action.SCREEN_OFF");

ZdLockService.this.registerReceiver(mScreenOffReceiver, mScreenOffFilter);

}

public int onStartCommand(Intent intent , int flags , int startId){

return Service.START_STICKY;

}

public void onDestroy(){

super.onDestroy();

ZdLockService.this.unregisterReceiver(mScreenOnReceiver);

ZdLockService.this.unregisterReceiver(mScreenOffReceiver);

//在此重新启动

startService(new Intent(ZdLockService.this, ZdLockService.class));

}

//屏幕变暗/变亮的广播 , 我们要调用KeyguardManager类相应方法去解除屏幕锁定
private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context , Intent intent) {
String action = intent.getAction() ;

Log.i(TAG, intent.toString());

if(action.equals("android.intent.action.SCREEN_OFF")
|| action.equals("android.intent.action.SCREEN_ON") ){
mKeyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock = mKeyguardManager.newKeyguardLock("zdLock 1");
mKeyguardLock.disableKeyguard();
startActivity(zdLockIntent);
}
}

};

更多相关文章

  1. 【Android】利用广播Broadcast接收SMS短信
  2. 【Android】动态注册广播接收器
  3. 【android】通话录音 -- service
  4. android开机自启广播无效果的曲线解决方案
  5. android系统权限大全
  6. 使用logcat命令
  7. Android(安卓)通过Intent调用系统功能和Action动作和服务广播【
  8. Android(安卓)监听wifi广播的两种方式
  9. Android接收程序安装、替换、卸载广播

随机推荐

  1. 利用html5开发android(转载)
  2. Android果然强大,连截字这种操作都集成了
  3. Android 中 drawTextOnPath 文字效果演示
  4. 关于 '@android:attr/windowEnterAnimati
  5. android 中的 openGL引擎的移植
  6. Android 如何去除Launcher上默认的google
  7. 学习android之布局
  8. android 预装第三方apk的方法(非system p
  9. Android笔记四 虚拟机Dalvik、Android各
  10. Android之View基础总结(View的事件体系一)