標籤:
1.廣播機制
標準廣播:
標準廣播(Normal broadcasts)是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播訊息,因此它們之間沒有任何先後順序可言,它是無法被截斷的。工作流程圖:
有序廣播:
有序廣播(Ordered broadcasts)則是一種同步執行的廣播,在廣播發出之後,同一時刻只會有一個廣播接收器能夠收到這條廣播訊息,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳遞。所以此時的廣播接收器是有先後順序的,優先順序高的廣播接收器就可以先收到廣播訊息,並且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣後面的廣播接收器就無法收到廣播訊息了。工作流程圖:
2.接受系統廣播:
註冊廣播的方式一般有兩種,在代碼中註冊和在 AndroidManifest.xml 中註冊,其中前者也被稱為動態註冊,後者也被稱為靜態註冊。
動態註冊:
建立項目,修改 MainActivity 中的代碼:
public class MainActivity extends Activity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show(); } }}
我們在MainActivity定義了一個內部類 NetworkChangeReceiver,繼承自 BroadcastReceiver。重寫了父類的 onReceive()方法,每當網路發生變換,onReceive()方法得到執行。
然後觀察 onCreate()方法,首先我們建立了一個 IntentFilter 的執行個體,並給它添加了一個值為 android.net.conn.CONNECTIVITY_CHANGE的action,當網路狀態發生變化時, 系統發 出的正是一條值為android.net.conn.CONNECTIVITY_CHANGE 的廣播,也就是說我們的廣播接收器想要監聽什麼廣播,就在這裡添加相應的action就行了。然後調用registerReceiver()
方法進行註冊。這樣NetworkChangeReceiver 就會收到所有值為 android.net.conn.CONNECTIVITY_CHANGE 的廣播,也就實現了監聽網路變化的功能。
動態註冊的廣播接收器一定都要取消註冊才行,這裡我們是在 onDestroy()方法中通過調用 unregisterReceiver()方法來實現的。
靜態註冊:
動態註冊的廣播接收器可以自由地控制註冊與登出,在靈活性方面有很大的優勢,但是它也存在著一個缺點,即必須要在程式啟動之後才能接收到廣播,靜態註冊就可以避免這種跟情況。
建立一個類BootCompleteReceiver 繼承自BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show(); }}
修改 AndroidManifest.xml 檔案
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcasttest" android:versionCode="1" android:versionName="1.0" >...... <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >...... <receiver android:name=".BootCompleteReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application></manifest>
<application>標籤內出現了一個新的標籤<receiver>,所有靜態註冊的廣播接收器都是在這裡進行註冊的。它的用法其實和<activity>標籤非常相似,首先通過 android:name來指定具體註冊哪一個廣播接收器,然後在<intent-filter>標籤裡加入想要接收的廣播就行了,由於 Android 系統啟動完成後會發出一條值為 android.intent.action.BOOT_COMPLETED 的廣播,因此我們在這裡添加了相應的 action。
另外,監聽系統開機廣播也是需要聲明許可權的,可以看到,我們使用<uses-permission>標籤又加入了一條 android.permission.RECEIVE_BOOT_COMPLETED 許可權。
這樣就能做開機接收廣播了。
未完~
安卓學習之廣播