四大組件-廣播

廣播接收器(Broadcast Receiver)

Android 中每一個程序均可以對本身須要的廣播進行註冊,這樣的話就能就收到註冊廣播所發送的內容。java

這些廣播能夠是系統的也能夠其餘應用程序的。android

1.廣播類型

廣播分兩種類型:網絡

標準廣播:徹底異步的廣播,發出廣播後全部註冊這個廣播的程序都會在同一時刻收的這條廣播。異步

有序廣播:是一種同步執行的廣播,在廣播發出後同一時刻只能有一個廣播接收器接收這條廣播,只有這個接收器中的邏輯執行完畢後,廣播纔會繼續傳遞。廣播是有前後順序的,優先級高的廣播接收器先接收到廣播,能夠經過 <receiver ... <intent-filter android:priority="100"> 來設置優先級,而且還能夠經過 abortBroadcast(); 將這條廣播截斷。ide

2.接收廣播

註冊廣播的兩種方式:動態 註冊、靜態註冊.net

  • (1)動態註冊(監聽網絡狀態變化案例)

動態註冊能夠自由的控制註冊和註銷,可是必須得在程序運行以後才能夠接收到廣播。線程

首先聲明網絡權限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);  //活動銷燬後 取消註冊
    }
  • (2)靜態註冊(開機啓動)

未啓動程序的狀況下就能夠接收到廣播

首先聲明權限

<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

3.發送自定義廣播

  • 發送標準廣播:
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);

4.Receiver 中開啓活動

若是想要在廣播接收器中開啓活動須要 在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);
    }

5.Receiver 中開啓服務

@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);
    }
相關文章
相關標籤/搜索