一、簡介
廣播是任何應(yīng)用均可接收的消息疹尾,分為標(biāo)準(zhǔn)廣播和有序廣播兩種洛史。系統(tǒng)將針對系統(tǒng)事件(例如:系統(tǒng)啟動或設(shè)備開始充電時)傳遞各種廣播惯殊。
二、接收廣播
想要接受廣播虹菲,需要注冊廣播接收者靠胜。Android提供了兩種注冊方式:靜態(tài)注冊和動態(tài)注冊。靜態(tài)注冊的廣播接收者可以在未啟動應(yīng)用的情況下就接收到自己感興趣的廣播毕源,動態(tài)注冊則更靈活浪漠。
2.1靜態(tài)注冊
1.繼承BroadcastReceiver實現(xiàn)廣播接收者。
<code>public class StaticBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"onReceive",Toast.LENGTH_SHORT).show();
}
}</code>
2.AndroidManifest中注冊自己感興趣的廣播
<code><receiver
android:name=".broadcastreceiver.StaticBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.DATE_CHANGED"/>
</intent-filter>
</receiver></code>
注意:接收某些廣播需要聲明權(quán)限
2.2動態(tài)注冊
registerReceiver()和unregisterReceiver()可以動態(tài)注冊和取消廣播霎褐。
registerReceiver(BroadcastReceiver, IntentFilter)動態(tài)注冊廣播
registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)動態(tài)注冊并聲明權(quán)限
1.實現(xiàn)BroadcastReceiver址愿。
這一步和上面的靜態(tài)廣播一樣
2.代碼中注冊
<code>doBroadcastReceiver = new DoBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_DATE_CHANGED);
registerReceiver(doBroadcastReceiver,intentFilter);</code>
3.取消注冊
<code>if(doBroadcastReceiver != null){
unregisterReceiver(doBroadcastReceiver);
}</code>
三、發(fā)送廣播
3.1 發(fā)送標(biāo)準(zhǔn)廣播
sendBroadcast(Intent)可以發(fā)送標(biāo)準(zhǔn)廣播
sendBroadcast(Intent, String)可以發(fā)送有權(quán)限的廣播冻璃,接收此廣播者需要聲明相應(yīng)權(quán)限响谓。
3.2 發(fā)送有序廣播
sendOrderedBroadcast(Intent)可以發(fā)送有序廣播
sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)可以發(fā)送有權(quán)限的有序廣播
四、本地廣播
全局廣播可以被各個應(yīng)用程序接收處理省艳,本地廣播則只在本應(yīng)用內(nèi)部傳遞娘纷,增加了廣播的安全性。本地廣播使用LocalBroadcastManager來管理廣播跋炕,廣播的發(fā)送和接收都通過LocalBroadcastManager來進(jìn)行赖晶。因此,也本地廣播無法在AndroidManifest中注冊。
<code>//獲取LocalBroadcastManager
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//廣播接收者
doBroadcastReceiver = new DoBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_DATE_CHANGED);
//注冊本地廣播接收
localBroadcastManager.registerReceiver(doBroadcastReceiver,intentFilter);
//取消本地廣播接收
if(doBroadcastReceiver != null){
localBroadcastManager.unregisterReceiver(doBroadcastReceiver);
}
//發(fā)送本地廣播
Intent intent = new Intent(Intent.ACTION_DATE_CHANGED);
localBroadcastManager.sendBroadcast(intent);
</code>
五遏插、廣播的聲明周期
BroadcastReceiver只在onReceive方法中有效捂贿,該方法返回則BroadcastReceiver結(jié)束。