Android中不能靜態註冊的廣播

Android中不能靜態註冊的廣播有:
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);
}
}

};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章