1、標準廣播:是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎會在同一時刻接收到這條廣播信息,它們之間沒有先後順序。效率高、無法被截斷。 2、有序廣播:是一種同步執行的廣播,在廣播發出後,同一時刻只會有一個廣播接收器能夠接收到這條廣播,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳 ...
1、標準廣播:是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎會在同一時刻接收到這條廣播信息,它們之間沒有先後順序。效率高、無法被截斷。
2、有序廣播:是一種同步執行的廣播,在廣播發出後,同一時刻只會有一個廣播接收器能夠接收到這條廣播,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳遞。
這種廣播有先後順序,優先順序高的廣播接收器就可以先接收到廣播,並且前面的廣播接收器可以截斷正在傳播的廣播。
3、動態註冊廣播:在主代碼中直接註冊。
4、創建廣播接收器:新建一個類,讓它繼承自BroadcastReceiver,並重寫父類的onReceive()方法。有廣播到來時,onReceive()方法中就會得到執行,具體邏輯就寫在這個方法中。
5、在onCreate()方法中使用registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 方法進行動態註冊,第一個參數傳入創建的類的實例,第二個參數傳入IntentFilter的實例。
6、下麵的代碼實現網路狀態的監聽:
public class MainActivity extends AppCompatActivity {
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"); //action中的值是要監聽的系統廣播 networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver,intentFilter); //用registerReceiver()方法進行註冊,分別傳入自定義類的實例和意圖實例 } //動態註冊的廣播接收器一定要取消註冊,使用unregisterReceiver()方法取消註冊 protected void onDestory(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); } //自定義一個類繼承自BroadcastReceiver,並重寫他的onReceive()方法 class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
}
}
}
7、最後要在AndroidManifest.xml中聲明許可權,否則程式會直接崩潰。註意:中間那行才是申請許可權,
package="example.com.broadcasttest"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application> </application>
8、模擬器的API要大於等於24才能運行以上代碼。仔細、仔細、仔細!!!!千萬不要寫錯單詞
9、靜態註冊廣播:在AndroidManifest中註冊,不必啟動程式就能實現接收廣播。
10、以下代碼實現接收開機廣播:在包名上右鍵,New—Other—Broadcast Receiver,更改廣播接收器的名字,勾選Exported和Enabled。這兩個屬性分別代表廣播接收器接收本程式意外的廣播和是否啟用這個廣播接收器。
package example.com.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show(); } }
<!--應用可以監聽該廣播,成為自啟動許可權,但是會拖慢開機速度--> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 。。。。。。。。。。。 <receiver android:name=".BootCompleteReceiver" android:enabled="true" android:exported="true"> <!--由於系統啟動後會發出一條值為"android.intent.action.BOOT_COMPLETED"的廣播,所以在下麵的標簽中添加了action--> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
10、onReceive()方法中寫需要實現的邏輯,但是不要在這方法中寫太多邏輯或者進行任何耗時的操作,因為廣播接收器中是不允許開啟線程的,當方法中運行了較長時間而沒有結束,程式就會報錯。