Android 四大組件學習之BroadcastReceiver四
本節學習系統中特殊的廣播接收者。
我們前面幾節不是說了,當廣播接受者一旦註冊到系統中,當系統發送的廣播和你註冊的廣播的action匹配時,系統就會啟動廣播接收者所在的進程。除非使用者手動停止廣播接收者所在的進程。但是生活中有這樣一種情況,比如說:我在玩網路遊戲,假設說遊戲本身在系統電量低的情況下,會自動儲存當前遊戲的進度,也就是存檔的。可以這麼說,此廣播接受者只有在使用者玩遊戲時才需要啟動,別的時候使用者是不需要的。如果此廣播接收者一直常駐於系統,那不是很浪費系統資源。所以我們就需要動態啟動廣播接收者,和停止廣播接收者。可是大家知道,廣播接收者只要在資訊清單檔中註冊過了的,就會永遠啟動的。所以唯一的辦法就是不在資訊清單檔中註冊,在代碼中動態註冊。
說了這麼多,就是說可以用代碼動態註冊廣播接收者。
說到在代碼中註冊廣播接收者,那Android系統中規定,螢幕鎖屏和解鎖,以及電量改變必須用代碼註冊,在資訊清單檔中註冊是不起作用的。那是因為,螢幕鎖屏和解鎖,以及電量改變事件太頻繁發生了。如果在資訊清單檔中註冊,將會對系統消耗很大。
那我們就用螢幕解鎖和鎖屏實現代碼中註冊廣播接收者
這次我們用服務去建立廣播接收者
Activity的代碼:也就是兩個按鈕,一個用於建立建立服務,一個用於停止服務
public class MainActivity extends Activity {Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent(this, ScreenService.class); } //啟動服務 public void openScreen(View v) { Log.i(MainActivity, 啟動廣播接收者服務); startService(intent); } //關閉服務 public void closeScreen(View v) { Log.i(MainActivity, 關閉廣播接收者服務); stopService(intent); }}然後Service的代碼:
public class ScreenService extends Service {private ScreenReceiver sReceiver;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// 註冊廣播接收者super.onCreate();//建立一個廣播接收者sReceiver = new ScreenReceiver();//指定接收那種類型的廣播IntentFilter filter = new IntentFilter();//指定關螢幕和開螢幕filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);//註冊廣播接收者registerReceiver(sReceiver, filter);Log.i(ScreenService, 廣播接受者登入);}@Overridepublic void onDestroy() {// 銷毀廣播接收者super.onDestroy();unregisterReceiver(sReceiver);Log.i(ScreenService, 廣播接受者已銷毀);}}在Service的onCreate方法中註冊廣播接收者,在Destory方法中銷毀廣播接收者
最終廣播接收者的代碼:
public class ScreenReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString action = intent.getAction();if(Intent.ACTION_SCREEN_OFF.equals(action)){//接收到管螢幕的廣播Log.i(ScreenReceiver, 螢幕關閉!);}else if(Intent.ACTION_SCREEN_ON.equals(action)){//接收到開螢幕的廣播Log.i(ScreenReceiver, 螢幕開啟!);}}}
資訊清單檔中,需要要佈建服務,廣播接收者不需要配置
運行效果如下:
ok。 就到這裡,大家瞭解下就行