廣播機制
發(fā)送廣播
Android中的廣播主要分為兩種類型——標(biāo)準(zhǔn)廣播和有序廣播
發(fā)出標(biāo)準(zhǔn)廣播
標(biāo)準(zhǔn)廣播發(fā)出后修陡,所有廣播接收器幾乎會在同一時刻接受到這條廣播信息笨蚁,因此不可以被截斷。
//action為廣播名
Intent intent = new Intent("action");
Context.sendBroadcast(intent);
發(fā)送有序廣播
有序廣播發(fā)出后钮莲,根據(jù)優(yōu)先級傳遞男翰,同一時刻只會有一顆廣播接收器能接收這條消息糯彬,前面的廣播接收器可以截斷廣播,使后面的廣播接收器無法收到廣播消息忿峻。
//action為廣播名
Intent intent = new Intent("action");
Context.setOrderedBroadcast(intent,null);
接收廣播
接收廣播需要新建一個類薄啥,并使他繼承于BroadcastReceiver,并重寫父類的onReceive()方法逛尚,當(dāng)廣播到來時會執(zhí)行onReceive方法
public class MyReciever extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
........
}
}
//onReceive方法必須在10s內(nèi)完成垄惧,否則程序就會報錯
要接受廣播,必須進行注冊绰寞,注冊分為靜態(tài)注冊和動態(tài)注冊
靜態(tài)注冊:
在AndroidManifest.xml中注冊
<mainifest ....
<application ....
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="action"/>
</intent-filter>
</receiver>
</application>
</manifest>
動態(tài)注冊
1.動態(tài)注冊在代碼中注冊
2.執(zhí)行registerReceiver()方法后開始接收廣播
3.動態(tài)注冊必需要取消注冊
public class MainActivity extends BaseActivity {
private IntentFilter intentFilter;
private MyReciever myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.setAction("action");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
}
}
@Override
protected void onDestroy(){
super.onDestroy();
upRegisterReceiver(myReceiver);
}
動態(tài)注冊和靜態(tài)注冊的區(qū)別:
動態(tài)注冊只能在活動運行時接受廣播赘艳,而靜態(tài)注冊是長駐在系統(tǒng)的
接受有序廣播
權(quán)重的取值范圍為-1000到1000
靜態(tài)注冊設(shè)置優(yōu)先級
<mainifest ....
<application ....
<receiver android:name=".MyReceiver">
<intent-filter android:priority="100">
<action android:name="action"/>
</intent-filter>
</receiver>
</application>
</manifest>
動態(tài)注冊設(shè)置優(yōu)先級
intentFilter = new IntentFilter();
intentFilter.setPriority(100);
有序廣播可在onReceive中傳遞數(shù)據(jù)給下一個廣播接收器
public void onReceive(Context arg0, Intent intent) {
//獲取上一個廣播的bundle數(shù)據(jù)
Bundle bundle = getResultExtras(true);//true:前一個廣播沒有結(jié)果時創(chuàng)建新的Bundle;false:不創(chuàng)建Bundle
bundle.putString("key", "168168");
//將bundle數(shù)據(jù)放入廣播中傳給下一個廣播接收者
setResultExtras(bundle);
//終止廣播傳給下一個廣播接收者
abortBroadcast();
}
我們可以在前一個廣播接收者將處理好的數(shù)據(jù)傳送給后面的廣播接收者克握,也可以調(diào)用abortBroadcast()來終結(jié)廣播的傳播蕾管。