Android 中每一個程序均可以對本身須要的廣播進行註冊,這樣的話就能就收到註冊廣播所發送的內容。java
這些廣播能夠是系統的也能夠其餘應用程序的。android
廣播分兩種類型:網絡
標準廣播:徹底異步的廣播,發出廣播後全部註冊這個廣播的程序都會在同一時刻收的這條廣播。異步
有序廣播:是一種同步執行的廣播,在廣播發出後同一時刻只能有一個廣播接收器接收這條廣播,只有這個接收器中的邏輯執行完畢後,廣播纔會繼續傳遞。廣播是有前後順序的,優先級高的廣播接收器先接收到廣播,能夠經過 <receiver ... <intent-filter android:priority="100">
來設置優先級,而且還能夠經過 abortBroadcast();
將這條廣播截斷。ide
註冊廣播的兩種方式:動態 註冊、靜態註冊.net
動態註冊能夠自由的控制註冊和註銷,可是必須得在程序運行以後才能夠接收到廣播。線程
首先聲明網絡權限code
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
建立一個NetworkChangeReceiver類繼承自BroadcastReceiverxml
class NetworkChangeReceiver extends BroadcastReceiver { @Override //當網絡狀態發生變化時執行 public void onReceive(Context context, Intent intent) { //獲得ConnectivityManager實例 再獲得NetworkInfo實例 來判斷網絡狀態 ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { Toast.makeText(context, "Network is available", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "Network is unavailable", Toast.LENGTH_SHORT).show(); } } }
而後MainActivity重註冊廣播繼承
public class MainActivity extends AppCompatActivity { private NetworkChangeReceiver networkChangeReceiver; //接收器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //動態註冊 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //添加想要監聽的廣播 networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); //註冊廣播 } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); //活動銷燬後 取消註冊 }
未啓動程序的狀況下就能夠接收到廣播
首先聲明權限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
經過Android Studio 來快捷的建立一個廣播接收器。
右鍵包名 --》New--》Other--》Broadcast Receiver ,接着會彈出建立窗口,咱們能夠設置兩個屬性,
這兩個屬性分別是:
Exported :是否容許這個廣播接收器接收本程序之外的廣播;
Enabled :是否啓用這個廣播接收器。
接着就幫咱們建立好了 MyReceiver,
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Starting up", Toast.LENGTH_SHORT).show(); //Toast } }
咱們只須要在 onReceive() 寫入咱們想要執行的邏輯就行。
注意:onReceive()方法中不要在執行過多邏輯或者耗時操做,並且該方法中不容許開啓線程,
而且清單文件中自動建立了註冊代碼
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
android:name 指定註冊哪個廣播接收器
在
<intent-filter>
中添加咱們要監聽的 Action
Intent intent=new Intent("com.tiger.broadcasttest.mytest"); sendBroadcast(intent);
這樣的話全部監聽 com.tiger.broadcasttest.mytest
這條廣播的接收器都會受到這條消息。
另外由於咱們是經過Intent進行傳遞的,咱們還能夠攜帶一些數據給其餘廣播接收器。
Intent intent=new Intent("com.tiger.broadcasttest.mytest"); sendOrderedBroadcast(intent,null);
若是想要在廣播接收器中開啓活動須要 在Intent中添加 FLAG_ACTIVITY_NEW_TASK,不然會報錯,由於須要一個棧來存儲打開互動
@Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Boot complete!", Toast.LENGTH_SHORT).show(); Intent intentStartActivity=new Intent(context,MainActivity.class); intentStartActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intentStartActivity); }
@Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Start myservice ", Toast.LENGTH_SHORT).show(); Intent startService=new Intent(context,MyService.class); context.startService(startService); }