BroadcastReceiver

BroadcastReceiver:廣播接收者,接收發送過來的廣播,本質是全局監聽器。廣播作爲Android一種通信方式,用途十分廣泛。例如:開機啓動後會接收到啓動服務的廣播,電量變化時會接收電量低及時保存的廣播提示,網絡變化會接收及時提示和保存的提示,檢測SD狀態廣播等等。
BroadcastReceiver的生命週期
實現BroadcastReceiver的實例非常簡單,繼承BroadcastReceiver會調用onReceive(),所有的操作直接在onReceive()中運行。執行完之後,BroadcastReceiver直接銷燬。該方法直接運行在UI線程中,大概只有10s左右,所以不可做耗時操作。
如何註冊
首先自定義一個BroadcastReceiver對象,繼承BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {
    private static final String Tag = "Myreceive";
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
         Log.i(Tag,"Myreceive:"+ msg);
    }
}

註冊:
1.靜態註冊:在AndroidManifest.xml中實現

<receiver android:name=".MyReceiver">
    <intent-filter>
       <action android:name="MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
       <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

補充(隱式跳轉):
1.一個Intent可以有多個category目錄,但至少會有一個默認的;
2.只有Intent的所有category都匹配上了,Activity才能接受這個Intent。
所以爲什麼要加category 這個默認方式了。
MianActivity代碼:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt_send = (Button) findViewById(R.id.bt_send);
        bt_send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           Intent intent = new  Intent("android.intent.action.MY_BROADCAST");//在配置文件中的action目錄做的配置
                                                intent.putExtra("msg","hello World");                                      sendBroadcast(intent);
                      }
               }
        );
    }

添加了一個發送按鈕,用來發送廣播
結果:
這裏寫圖片描述
2.動態註冊

MyReceiver myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();      intentFilter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(myReceiver,intentFilter);//動態註冊

結果:
這裏寫圖片描述
動態註冊在程序關閉時是收不到廣播的,但是靜態可以。

根據廣播的發送方式可以分爲:
1.Normal Broadcast普通廣播
2.System Broadcast系統廣播
3.Ordered Broadcast有序廣播
4.Local BroadcastApp內部廣播
5.Sticky Broadcast粘性廣播(5.0不在推薦)

1.普通廣播:
建立了三個自定義廣播類
MyReceiver

public class MyReceiver extends BroadcastReceiver {
    private static final String Tag = "Myreceive";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag, "Myreceive:" + msg);
    }
}

FirstReceiver

public class FirstReceiver extends BroadcastReceiver {
    private static final String Tag = "FirstReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag, "FirstReceiver:" + msg);
    }
}

SecondReceiver

public class SecondReceiver extends BroadcastReceiver {
    private static final String Tag = "SecondReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag, "SecondReceiver:" + msg);
    }
}

MainActivity:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt_send = (Button) findViewById(R.id.bt_send);
        bt_send.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
       Intent intent = new   Intent("android.intent.action.MY_BROADCAST");
       intent.putExtra("msg","hello World");
       sendBroadcast(intent);
                }
            }
        );
    }
}

在配置文件中添加相應的配置
結果:

04-06 08:01:34.308 30288-30288/com.appress.gerber.broadcastreceiver I/Myreceive: **Myreceive:hello World**
04-06 08:01:34.308 30288-30288/com.appress.gerber.broadcastreceiver I/FirstReceiver: **FirstReceiver:hello World**
04-06 08:01:34.308 30288-30288/com.appress.gerber.broadcastreceiver I/SecondReceiver: **SecondReceiver:hello World**

都接收到了消息。

有序廣播:
使用sendOrderedBroadcast()方法,優先級-1000到1000
在配置文件中配置優先級

    <receiver android:name=".MyReceiver">
        <intent-filter android:priority="10"><!--優先級10-->
            <action android:name="android.intent.action.MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </receiver>
        <receiver android:name=".FirstReceiver">
            <intent-filter android:priority="80"><!--優先級80-->
                <action android:name="android.intent.action.MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".SecondReceiver">
            <intent-filter android:priority="-20"><!--優先級-20-->
                <action android:name="android.intent.action.MY_BROADCAST"/><!-- 隱式發送,用來匹配Intent-->
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

MainActivity:沒有做設置權限,直接null,如果設置權限只能接收相同權限的廣播。

 sendOrderedBroadcast(intent,null);

結果:優先級FirstReceiver,Myreceive,SecondReceiver

04-06 08:18:36.716 14590-14590/com.appress.gerber.broadcastreceiver I/FirstReceiver: **FirstReceiver:hello World**
04-06 08:18:36.716 14590-14590/com.appress.gerber.broadcastreceiver I/Myreceive: **Myreceive:hello World**
04-06 08:18:36.716 14590-14590/com.appress.gerber.broadcastreceiver I/SecondReceiver: **SecondReceiver:hello World**

Local Broadcast:App內部廣播,說明廣播可以跨進程之間通信。(自己不怎麼了解)
System Broadcast:Android系統內置了多個系統廣播,只要涉及到基本操作的基本上都帶有廣播

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章