簡(jiǎn)介
Broadcast Receiver迎变,即廣播接收器,顧名思義稠屠,通過(guò)廣播的方式進(jìn)行消息傳遞。
分類(lèi)
標(biāo)準(zhǔn)廣播
這是一種完全異步執(zhí)行的廣播,這種廣播發(fā)出后权埠,所有接收器之間幾乎同時(shí)收到消息榨了,它們之間沒(méi)有任何順序可言,因此這種廣播效率比較高攘蔽,無(wú)法被攔截龙屉。有序廣播
這是一種同步執(zhí)行的廣播,這種廣播發(fā)出后满俗,各接收器是按照注冊(cè)的優(yōu)先級(jí)的順序來(lái)進(jìn)行接收的转捕,優(yōu)先級(jí)高的先接收,優(yōu)先級(jí)低的后接收唆垃,并且可以被中斷五芝,一旦被中斷則后續(xù)接收器則無(wú)法接收到此消息了。
使用方式
廣播使用方式基本相同辕万,在BroadcastReceiver
類(lèi)中的onReceive()
方法中處理接收器邏輯枢步,但是不能進(jìn)行耗時(shí)操作,因?yàn)樵谶@里不允許開(kāi)啟線(xiàn)程的蓄坏;另外廣播是有優(yōu)先級(jí)的价捧,優(yōu)先級(jí)高的先收到廣播丑念。
- 標(biāo)準(zhǔn)廣播
-
系統(tǒng)廣播
- 靜態(tài)注冊(cè)
第一步涡戳,編寫(xiě)廣播接收器處理代碼,該類(lèi)繼承自BroadcastReceiver類(lèi)
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show(); } }
第二步脯倚,在manifest文件中聲明
<receiver android:name=".broadcast.BootCompleteReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
第三步渔彰,添加權(quán)限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
靜態(tài)注冊(cè)的方式是通過(guò)xml在manifest文件中進(jìn)行注冊(cè),其特點(diǎn)是:在程序未啟動(dòng)的情況也能接收到廣播消息推正,并且無(wú)法取消注冊(cè)恍涂。
- 動(dòng)態(tài)注冊(cè)
第一步,編寫(xiě)廣播接收器處理代碼植榕,該類(lèi)繼承自BroadcastReceiver類(lèi)
public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //get the state of network ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); String state; if (networkInfo != null && networkInfo.isAvailable()) { state = "available"; } else { state = "unavailable"; } Toast.makeText(context, "Network is " + state, Toast.LENGTH_LONG).show(); } }
第二步再沧,在A(yíng)ctivity 中注冊(cè)及取消
public class BroadcastDynamicSystemActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; public static void startAction(Context context) { context.startActivity(new Intent(context, BroadcastDynamicSystemActivity.class)); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broadcast_dynamic_system); //register network change broadcast receiver this.intentFilter = new IntentFilter(); this.intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); this.networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(this.networkChangeReceiver, this.intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //unregister network change broadcast receiver unregisterReceiver(this.networkChangeReceiver); } }
第三步,在manifest文件中添加網(wǎng)絡(luò)訪(fǎng)問(wèn)權(quán)限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
動(dòng)態(tài)注冊(cè)的流程是:先編寫(xiě)廣播接收器的處理方法(繼承自BroadcastReceiver類(lèi))尊残,然后在應(yīng)用的地方進(jìn)行注冊(cè)和取消注冊(cè)炒瘸。這種方式的特點(diǎn)是:
1. 只有動(dòng)態(tài)注冊(cè)代碼執(zhí)行了才會(huì)接收廣播,沒(méi)執(zhí)行是不會(huì)收到廣播的寝衫;
2. 需要實(shí)時(shí)取消注冊(cè)顷扩,以防內(nèi)存泄漏。 -
自定義廣播
- 標(biāo)準(zhǔn)廣播
第一步慰毅,編寫(xiě)廣播接收器處理代碼隘截,該類(lèi)繼承自BroadcastReceiver類(lèi)
public class MyStandardBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "My Standard Broadcast Receiver", Toast.LENGTH_LONG).show(); } }
第二步,在manifest中注冊(cè)(此為靜態(tài)注冊(cè)方式注冊(cè),亦可動(dòng)態(tài)方式注冊(cè))
<receiver android:name=".broadcast.MyStandardBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcast.MY_BROADCAST" /> </intent-filter> </receiver>
第三步婶芭,發(fā)送自定義廣播
sendBroadcast(new Intent("com.example.broadcast.MY_BROADCAST"));
這里需要注意的是廣播的action name必須一致东臀。
- 有序廣播
第一步,編寫(xiě)廣播接收器處理代碼雕擂,該類(lèi)繼承自BroadcastReceiver類(lèi)
public class MyOrderedBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "My Ordered Broadcast Receiver", Toast.LENGTH_LONG).show(); //中斷傳播 abortBroadcast(); } }
第二步啡邑,在manifest中注冊(cè)(此為靜態(tài)方式注冊(cè),亦可動(dòng)態(tài)注冊(cè))
<receiver android:name=".broadcast.MyOrderedBroadcastReceiver"> <intent-filter android:priority="100"> <action android:name="com.example.broadcast.MY_BROADCAST" /> </intent-filter> </receiver>
第三步井赌,發(fā)送自定義廣播
sendOrderedBroadcast(new Intent("com.example.broadcast.MY_BROADCAST"), null);
有序廣播和標(biāo)準(zhǔn)廣播使用方式上唯一區(qū)別在于發(fā)送方法不同以及有序廣播可以通過(guò)
abortBroadcast()
方法來(lái)中斷廣播的傳遞谤逼。
-
-
本地廣播
標(biāo)準(zhǔn)廣播都是全局的,即不僅本應(yīng)用會(huì)接收而且其他應(yīng)用也可以接收仇穗,因此如果一直發(fā)送標(biāo)準(zhǔn)廣播不僅會(huì)對(duì)系統(tǒng)造成污染流部,而且也會(huì)帶來(lái)安全隱患,為了解決這些問(wèn)題纹坐,Android系統(tǒng)引入了本地廣播機(jī)制枝冀。
-
使用方法
第一步,編寫(xiě)廣播接收器處理代碼耘子,該類(lèi)繼承自BroadcastReceiver類(lèi)public class LocalBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Local Broadcast Receiver", Toast.LENGTH_LONG).show(); } }
第二步果漾,發(fā)送廣播
private IntentFilter intentFilter; private LocalBroadcastReceiver localBroadcastReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { …… this.intentFilter = new IntentFilter(); this.intentFilter.addAction("com.example.broadcast.MY_LOCAL_BROADCAST"); this.localBroadcastManager = LocalBroadcastManager.getInstance(this); this.localBroadcastReceiver = new LocalBroadcastReceiver(); this.localBroadcastManager.registerReceiver(this.localBroadcastReceiver, this.intentFilter); } @Override protected void onDestroy() { super.onDestroy(); this.localBroadcastManager.unregisterReceiver(this.localBroadcastReceiver); } //發(fā)送本地廣播 this.localBroadcastManager.sendBroadcast(new Intent("com.example.broadcast.MY_LOCAL_BROADCAST"));
-
特點(diǎn)
- 消息只在本應(yīng)用內(nèi)進(jìn)行傳遞;
- 無(wú)法通過(guò)靜態(tài)注冊(cè)的方式進(jìn)行注冊(cè)谷誓;
- 比系統(tǒng)全局廣播更高效绒障。
-
總結(jié)
- 當(dāng)需要在程序未啟動(dòng)就接收廣播消息時(shí),使用靜態(tài)注冊(cè)方式注冊(cè)廣播捍歪;
- 當(dāng)需要靈活控制接收或者不接受廣播消息時(shí)户辱,使用動(dòng)態(tài)注冊(cè)方式注冊(cè)廣播;
- 當(dāng)廣播消息僅在本應(yīng)用內(nèi)部進(jìn)行傳遞糙臼,使用本地廣播更高效更安全庐镐;
- 當(dāng)需要對(duì)廣播消息對(duì)傳遞進(jìn)行順序控制時(shí),使用有序廣播廣播变逃。