作為Android四大組件的成員恩商,BroadcastReceiver的首要職責(zé)就是接收廣播,從而進(jìn)行應(yīng)用內(nèi)外的信息傳遞
Android基礎(chǔ)-BroadcastReceiver廣播接收器
廣播類型
- 標(biāo)準(zhǔn)廣播
- 異步執(zhí)行
- 無(wú)序
- 不可攔截
- 有序廣播
- 同步執(zhí)行
- 有序:優(yōu)先級(jí)高的優(yōu)先接收
- 可攔截:先收到廣播的接收器還能截?cái)鄰V播的傳遞
如何接收廣播
有廣播自然就有廣播接收器,通過(guò)IntentFilter來(lái)過(guò)濾不需要的廣播,接收指定的廣播
-
動(dòng)態(tài)注冊(cè)廣播(網(wǎng)絡(luò)變化為廣播信息,發(fā)生變化后彈出Toast提示)
public class BroadcastActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broadcast); findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用IntentFilter指定接收者訂閱的廣播 IntentFilter filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //注冊(cè)廣播后,Receiver即可正常接收廣播,onCreate注冊(cè)則最后在onDestory階段unRegisterReceiver,onResume注冊(cè)則onPause注銷垮媒,避免重復(fù)注冊(cè) registerReceiver(new DynamicReceiver(),filter); } }); } class DynamicReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "DynamicReceiver received", Toast.LENGTH_SHORT).show(); } } }
-
靜態(tài)注冊(cè)(發(fā)送的是一條標(biāo)準(zhǔn)廣播,所有監(jiān)聽(tīng)對(duì)應(yīng)Aciton都會(huì)收到信息)
-
在manifest文件中注冊(cè)接收器,同動(dòng)態(tài)注冊(cè)一般,為intent-filter指定接收對(duì)應(yīng)Action的廣播,該action可以是自定義的也可以是系統(tǒng)的
<receiver android:name=".lesson1.First" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="org.fourstars.lesson1.first" /> </intent-filter> </receiver>
然后在需要的地方調(diào)用sendBroadcast即可發(fā)送廣播
-
-
有序廣播的接收
-
設(shè)置Receiver的優(yōu)先級(jí)
<receiver android:name=".lesson1.First" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> <action android:name="org.fourstars.lesson1.first" /> </intent-filter> </receiver> <receiver android:name=".lesson1.Second" android:enabled="true" android:exported="true"> <intent-filter android:priority="90"> <action android:name="org.fourstars.lesson1.first" /> </intent-filter> </receiver>
此時(shí)根據(jù)優(yōu)先級(jí)決定First先接收廣播,可以在First中的onReceive中調(diào)用abortBroadcast來(lái)終止廣播的傳遞,即Secend無(wú)法接收到"org.fourstars.lesson1.first"的廣播
本地廣播
前面幾種廣播都屬于系統(tǒng)全局廣播,即發(fā)出的廣播可以被所有應(yīng)用程序接收,可能你在某某應(yīng)用搜索的關(guān)鍵詞就是這樣被傳遞到另一個(gè)應(yīng)用,然后另一個(gè)應(yīng)用就大肆推廣該關(guān)鍵詞的信息給你
而本地廣播只能在應(yīng)用內(nèi)傳遞,不能跨進(jìn)程傳遞用法
基本上跟動(dòng)態(tài)接收廣播無(wú)異,區(qū)別在于本地廣播用LocalBroadcastManager進(jìn)行廣播的注冊(cè)和發(fā)送
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //其他代碼 LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this); IntentFilter filter = new IntentFilter(); filter.addAction("org.fourstars.lesson1.local"); //注意:不使用廣播需要注銷該接收器,LocalReceiver為自定義的廣播接收器 manager.registerReceiver(new LocalReceiver(),filter); }
-
Tips
由于BroadcastReceiver的生命周期比較短暫,在onReceive階段,不要做耗時(shí)操作,避免因生命周期的結(jié)束而中斷操作,相應(yīng)操作應(yīng)由Service中進(jìn)行