本系列持續更新中.... 初級階段內容參考《第一行代碼》java
Android 中每一個應用程序均可以對本身感興趣的廣播進行註冊,這樣當註冊的廣播發出時,應用程序就會接受到。這些廣播可能來自系統,也可能來自其餘應用程序。android
接受廣播須要用到Broadcast Receiver
廣播接收器。markdown
Android 中的廣播分爲兩種:標準廣播和有序廣播。網絡
標準廣播:是一種徹底異步執行的廣播,在廣播發出後幾乎全部的接收器都會在同一時刻受到廣播消息。所以它們之間沒有任何的前後順序,這種廣播效率比較高,但同時意味着不能被截斷。異步
有序廣播:是一種同步執行的廣播,在廣播發出後,同一時刻只有一個廣播接收器可以收到這條廣播消息,當這個廣播接收器中的邏輯執行完畢後廣播纔會繼續傳播。有序廣播是有前後順序的,優先級高的會優先接受到廣播而且能夠截斷正在傳遞的廣播。ide
Android 系統內置了許多的系統級別的廣播,咱們能夠經過這些廣播來獲取手機的一些狀態。好比手機開機會發送一條廣播,電池電量發生變化會發送廣播,時間或者時區發生改變會發送廣播等等。oop
註冊廣播的方式有兩種:一種是在代碼中註冊稱爲動態註冊,另外一種是在 AndroidManifest.xml
中註冊稱爲靜態註冊。ui
如何才能接受到廣播呢?首先要建立一個廣播接收器。spa
新建一個類,讓他繼承 BoradcastReceiver
並重寫 onReceive()
方法,當接受到廣播後就會執行 onReceive()
方法,這樣一個簡單的廣播包接收器就建立好了。.net
下面來具體實踐一下:
public class NetChangeActivity extends AppCompatActivity { NetWorkChangeReceiver netWorkChangeReceiver; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ui); IntentFilter intentFilter = new IntentFilter(); // 每當網絡狀態發生改變的時候都會接受到廣播(有網絡了,沒有網絡了,切換到 WiFi了) intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); netWorkChangeReceiver = new NetWorkChangeReceiver(); registerReceiver(netWorkChangeReceiver,intentFilter); } class NetWorkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"網絡狀態發生變化",Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(netWorkChangeReceiver); } } 複製代碼
其實具體過程很簡單,步驟:
registerReceiver()
來註冊廣播進一步編寫,告訴用戶當前是有網絡仍是沒有網絡
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo!=null && networkInfo.isAvailable()){ Toast.makeText(context,"網絡可用",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context,"網絡不可用",Toast.LENGTH_SHORT).show(); } 複製代碼
主要是經過 ConnectivityManager
這個專門用於管理網絡的服務類來實現的。
注意這裏須要訪問系統的網絡狀態,須要聲明權限,在 AndroidManifest.xml
中
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 複製代碼
動態註冊廣播接受有一個缺點就是必須程序運行了才能夠接受到廣播,緣由很簡單,只有咱們打開了對應的程序頁面運行了註冊的邏輯才能夠接受到廣播。
那麼怎麼樣可讓程序在沒有啓動的狀況下就能接受到廣播呢?這就須要靜態註冊了。
靜態註冊可讓程序沒有啓動就接受到廣播消息
代碼實現:首先咱們新建一個 Java 類繼承自 BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"開機完成",Toast.LENGTH_SHORT).show(); } } 複製代碼
很簡單,當接收到開機廣播後就Toast
一下就能夠了。下面開始進行靜態註冊,到 AndroidManifest.xml
中,其實和註冊 Activity 很是類似
<receiver android:name="com.example.firstcode.fifty_chapter.bootreceiver.BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
複製代碼
重點是 exported
設置爲 true 表示能夠接受本程序以外的廣播,否則就接受不到程序外的廣播了,由於要接受開機廣播,不是咱們的程序本身發出的因此要設置爲 true 。enable 的意思就是啓用這個廣播接收器。
經過 action 標籤指定要接受的廣播。接受開機廣播須要權限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 複製代碼
好了,這樣在開機的時候就會接受到廣播了。
注意: 廣播接收器 onReceive()
方法裏面不要作太多的邏輯或者任何的耗時操做,由於在廣播接收器中是不容許開啓線程的,而且若是 onReceive()
方法運行了較長時間而沒有結束的話程序就會報錯。所以廣播接收器扮演的是一種打開程序其餘組件的角色,好比建立狀態欄通知,或者啓動一個服務等等。