發(fā)送廣播只是需要發(fā)送自己定義的廣播,那種類似于系統(tǒng)廣播等已有的廣播是不需要自己手動的發(fā)送的。
無論廣播注冊的形式是什么樣的,發(fā)送廣播都是一樣的方法。
發(fā)送標準廣播
標準廣播的意思是:注冊了這個廣播的所有接收者收到這條廣播的順序是一樣的,不存在先后順序,也不可以截斷這條廣播
發(fā)送廣播也是通過intent來實現(xiàn)的
在intent中可以傳遞參數(shù),傳遞的參數(shù)可以給接收者接收
Intent intent=new Intent();
//設(shè)置action
intent.setAction("com.zyl.receiver");
//傳遞參數(shù)
intent.putExtra("name","name");
sendBroadcast(intent);
在接收者中接收參數(shù),onReceive有兩個參數(shù),
第一個是上下文,如果是服務(wù)發(fā)的廣播,那么context就是對應(yīng)的service對象。如果是活動發(fā)的廣播,那么context就是activity對應(yīng)的對象。
這個參數(shù)可以做相應(yīng)的接口回調(diào)的功能。
第二個參數(shù)就是發(fā)送的intent,可以獲取intent中攜帶的參數(shù),intent設(shè)置的action等等。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("receiver",intent.getStringExtra("name"));
}
}
發(fā)送有序廣播
如果多個廣播接收者同時注冊了一個廣播,那么有序廣播就會按照這些廣播接收者的優(yōu)先級一次發(fā)送廣播。
1 設(shè)置優(yōu)先級的方法
priority值越大,越先接收到廣播
如果是靜態(tài)注冊
<receiver android:name=".broadcast.MyReceiver">
<intent-filter android:priority="100">
<action android:name="com.zyl.receiver"/>
</intent-filter>
</receiver>
如果是動態(tài)注冊
myReceiver=new MyReceiver();
//設(shè)置action
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.zyl.receiver");
intentFilter.setPriority(100);
//注冊廣播
registerReceiver(myReceiver,intentFilter);
2 發(fā)送有序廣播
2.1 發(fā)送的方法
發(fā)送有序廣播時intent的設(shè)置不變,可以設(shè)置action,設(shè)置傳遞的參數(shù)
發(fā)送廣播的方法變成sendOrderedBroadcast,他有兩個重載,一個是接收兩個參數(shù)的,一個是接收七個參數(shù)的
接收兩個參數(shù)的
/*
2個參數(shù)的
1:intent
2:權(quán)限,設(shè)置為null就可以
*/
sendOrderedBroadcast(intent,null);
接收七個參數(shù)的
/*
7個參數(shù)的
1:intent
2:權(quán)限,設(shè)置為null就可以
3 一個廣播接收者的對象
4 handler:設(shè)置為null就可以
5 code:隨意傳入一個int類型值
6 需要傳遞的String類型的數(shù)據(jù),如果沒有就設(shè)置為null
7 需要傳遞的Bundle類型的數(shù)據(jù),如果沒有就設(shè)置為null
*/
sendOrderedBroadcast(intent,null,null,null,0,"一段數(shù)據(jù)",bundle);
2.2 截斷廣播
當優(yōu)先級高的接收者接收到廣播時,可以截斷廣播
在onReceive中調(diào)用abortBroadcast()方法,優(yōu)先級在它后面的接收者就都不會收到廣播了,但是無論在onReceive中的什么位置調(diào)用abortBroadcast(),不影響它自己的onReceive方法執(zhí)行完
public class FirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();
}
}
2.3 傳遞參數(shù)
有序廣播在傳遞參數(shù)時,即可以通過intent方式傳遞參數(shù),也可以在發(fā)送廣播時傳遞參數(shù)
如果發(fā)送的方式是發(fā)送兩個參數(shù)的方法,則只能通過intent傳遞數(shù)據(jù)
如果是接收七個參數(shù)的方法,則即可以通過intent方式傳遞參數(shù),也可以在發(fā)送廣播時傳遞參數(shù)
下面詳細說明這種方法
1 七個參數(shù)的第六個可以攜帶一個String類型的數(shù)據(jù),第七個可以攜帶一個Bundle類型的數(shù)據(jù)。
發(fā)送這樣一條廣播
Intent intent=new Intent();
intent.setAction("zyl");
intent.putExtra("name","name");
Bundle bundle=new Bundle();
bundle.putInt("key",111);
sendOrderedBroadcast(intent,null,null,null,0,"一段數(shù)據(jù)",bundle);
此時有兩個廣播接收者
第一個
public class FirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//getResultData()方法接收第六個參數(shù)
String value=getResultData();
//getResultExtras(true)方法接收第七個參數(shù)
Bundle bundle=getResultExtras(true);
int num=bundle.getInt("key");
Log.i("receiver",value+num);
}
}
<receiver android:name=".broadcast.FirstReceiver">
<intent-filter android:priority="100">
<action android:name="zyl"/>
</intent-filter>
</receiver>
第二個
public class SecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String value=getResultData();
Bundle bundle=getResultExtras(true);
int num=bundle.getInt("key");
Log.i("receiver",value+num);
}
}
<receiver android:name=".broadcast.SecondReceiver">
<intent-filter android:priority="50">
<action android:name="zyl"/>
</intent-filter>
</receiver>
用getResultData和getResultExtras分別接收String類型和Bundle類型的參數(shù)。
如果廣播沒有被截斷,同時優(yōu)先級高的接收者沒有對參數(shù)進行處理,則所有接收者都會接收到相同的參數(shù)。
☆☆☆☆如果廣播被截斷,則后面的接收者不會接收到這條廣播,更不會收到數(shù)據(jù)。
☆☆☆☆如果優(yōu)先級高的接收者對數(shù)據(jù)進行處理
public class FirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String value=getResultData();
Bundle bundle=getResultExtras(true);
int num=bundle.getInt("key");
Log.i("receiver",value+num);
//FirstReceiver先收到廣播,它收到的數(shù)據(jù)就是sendOrderedBroadcast中攜帶的數(shù)據(jù)
//setResultData方法更改String類型的數(shù)據(jù),即第六個參數(shù)的數(shù)據(jù)
setResultData("no");
Bundle bundle1=new Bundle();
bundle1.putInt("num",222);
//setResultExtras更改第七個參數(shù)的數(shù)據(jù),即bundle類型的數(shù)據(jù)
setResultExtras(bundle);
}
}
public class SecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//這時getResultData收到的就是FirstReceiver中setResultData方法發(fā)送的數(shù)據(jù)
String value=getResultData();
//getResultExtras收到的就是FirstReceiver中setResultExtras方法發(fā)送的數(shù)據(jù)
Bundle bundle=getResultExtras(true);
int num=bundle.getInt("key");
Log.i("receiver",value+num);
}
}
所以FirstReceiver收到的就是一段數(shù)據(jù)和111
SecondReceiver收到的就是no和222
如果還有其他的接收者,接收到的也都是FirstReceiver修改后的參數(shù),
如果其中某個接收者再次修改了參數(shù),那么就會按照修改的繼續(xù)往下傳,以此推類。
2.4 sendOrderedBroadcast中的第三個參數(shù)
第三個參數(shù)傳入一個廣播接收者的對象,這個對象很特殊
首先,它不需要在清單文件中注冊,也不需要動態(tài)注冊,什么都不需要
其次,如果廣播發(fā)送過程中沒有被截斷,那么它將最后收到這條廣播,如果廣播發(fā)送過程中被截斷,他也會接著收到這條廣播
public class FInalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
Intent intent=new Intent();
intent.setAction("zyl");
intent.putExtra("name","name");
Bundle bundle=new Bundle();
bundle.putInt("key",111);
sendOrderedBroadcast(intent,null,new FInalReceiver(),null,0,"一段數(shù)據(jù)",bundle);
如果沒有人截斷廣播,那么收到廣播的順序就是
FirstReceiver,SecondReceiver,F(xiàn)InalReceiver
如果FirstReceiver截斷廣播,那么收到廣播的順序就是
FirstReceiver,F(xiàn)InalReceiver
FInalReceiver也和FirstReceiver,SecondReceiver可以接收前面?zhèn)鱽淼腟tring類型的數(shù)據(jù)或者Bundle類型的數(shù)據(jù),或者是intent攜帶的參數(shù)。