今天介紹一下Android的四大組件之一的BroadCastReceiver,即廣播。廣播類似於JAVA設計模式中的觀察者模式,即當被觀察者數據變化的時候,會去通知觀察者做相應處理。這里也是一樣,當發出廣播的時候,那么注冊過該廣播的人,就能收到這個廣播,進而做一些工作。
上面說的廣播注冊,在Android中有兩種方式,即動態注冊(代碼注冊)、靜態注冊(清單文件注冊),下面我以Android中網絡狀態變化發出的廣播作為例子,看看這兩種方式的具體用法。
動態注冊:即用代碼動態的注冊、注銷廣播
public class DynamicInternetActivity extends AppCompatActivity { private InternetDynamicBroadCastReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamic_lock_screen); IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); mReceiver = new InternetDynamicBroadCastReceiver(); this.registerReceiver(new InternetDynamicBroadCastReceiver(), filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } public class InternetDynamicBroadCastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(DynamicInternetActivity.this,"網絡發生了變化",Toast.LENGTH_SHORT).show(); } } }
在清單文件中注冊該廣播接受者。
<receiver android:name=".broadcastreceiver.net_monitor.DynamicInternetActivity$InternetDynamicBroadCastReceiver"/>
注意:上面在onDestroy方法中,必須注銷廣播,否則有內存泄漏的風險!!!
靜態廣播:把廣播寫死在manifest.xml中
public class InternetStaticBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"網絡發生了變化",Toast.LENGTH_SHORT).show(); } }
在清單文件中注冊該廣播接受者。
<receiver android:name=".broadcastreceiver.net_monitor.InternetStaticBroadCastReceiver"> <intent-filter> <!--<action android:name="ConnectivityManager.CONNECTIVITY_ACTION"/>//這樣寫是不對的--> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>//此處必需指定action,否則監聽不到 </intent-filter> </receiver>
注意:靜態注冊的廣播,必需單獨成一個類,不能像動態注冊那樣寫在某個界面里。否則當監聽到網絡狀態變化的時候,會拋出異常。
動態注冊和靜態注冊的區別:
動態注冊的廣播會受Activity的生命周期的影響, 當Activity銷毀的時候,廣播就失效了。
而靜態注冊的廣播,即使Activity銷毀了,仍然可以收到廣播。更牛掰的是即使殺死進程,仍然可以收到廣播,關於這點不同的手機測試的結果是不同的,為了驗證這個問題,我用的是google的nexus手機測試的。
在Android中,有一些action是不支持靜態注冊的:
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