上一篇Android廣播接收器(一)講了使用動態(tài)注冊和靜態(tài)靜注冊廣播接收器的方法來接收系統(tǒng)發(fā)出的廣播麦箍。這篇要講的是如何來發(fā)送自定義廣播漓藕。
1.發(fā)送標準廣播
- 首先新建一個類繼承自BroadcastReceiver,用來接收廣播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"recived in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
- 接下來需要在AndroidManifest.xml對這個廣播接收器進行注冊
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.feiben.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
類似于上一篇講的靜態(tài)注冊廣播接收器的方法,但這里的action是我們自己定義的挟裂。
- 在布局文件中放置一個Button撵术,用來作為發(fā)送廣播的觸發(fā)點
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_send_broadcast"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Broadcast"
android:textAllCaps="false" />
</LinearLayout>
- 在MainActivity中實現(xiàn)Button的邏輯處理
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnSendBroadcast = (Button) findViewById(R.id.btn_send_broadcast);
btnSendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.feiben.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
}
每次點擊Button就會創(chuàng)建一個Intent實例话瞧,并把要發(fā)送的廣播的值傳進去嫩与,在調(diào)用Context的sendBroadcast()方法將廣播發(fā)送出去,這樣發(fā)出的就是一條標準廣播了。效果如下
2.發(fā)送有序廣播
廣播是一種跨進程的通信方式交排,因此在我們的應(yīng)用程序內(nèi)發(fā)出的廣播划滋,其他的應(yīng)程序也是可以收到的。因此在這新建一個BroadcastTest2的項目來驗證這一點埃篓。
- 新建項目之后新建一個AnotherBroadcastReceiver類繼承BroadcastReceiver來接收上一節(jié)的廣播处坪。
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
- 接著在AndroidManifest.xml中注冊廣播接收器
<receiver android:name=".AnotherBroadcastReceiver">
<intent-filter>
<action android:name="com.feiben.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
可以看到AnotherBrcom.feiben.broadcastReceiver同樣接收到com.feiben.brcom.feiben.broadcasttest.MY_BROADCAST這條廣播
到現(xiàn)在為止程序發(fā)出的還是標準廣播,接下來就來看看怎么發(fā)出有序廣播架专。先關(guān)閉BroadcastTest2這個項目同窘,然后修改BroadcastTest項目MainActivity的代碼。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main)部脚;
Button btnSendBroadcast = (Button) findViewById(R.id.btn_send_broadcast);
btnSendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.feiben.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent歉眷,null);
}
});
}
}
發(fā)送有序廣播只需要修改一行代碼即可隔崎,即將sendBroadcast()方法改為sendOrderedBroadcast()方法,第一個參數(shù)仍是Intent,第二個參數(shù)是一個權(quán)限相關(guān)的字符串锄贼,傳入null就行宝鼓。重新運行程序阁吝,可以發(fā)現(xiàn)與前面的標準廣播并無區(qū)別崔赌。但其實有序廣播發(fā)送是有先后順序的,而且優(yōu)先級高的在接收到廣播之后還可以對其進行截斷淆珊,阻止繼續(xù)廣播夺饲。怎么設(shè)定廣播接收器的優(yōu)先級呢?這就需要在AndroidManifest.xml中進行設(shè)定了。
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.feiben.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
可以看到往声,利用android:priority屬性就可以給廣播接收器設(shè)置優(yōu)先級了茫蛹。這里把優(yōu)先級設(shè)置為100,保證它一定會在AnotherBroadcastReceiver之前收到廣播了烁挟。接著就來試一下阻止這條廣播的繼續(xù)傳遞婴洼。修改MyBroadcastReceiver中的代碼。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"recived in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
在onReceive()方法中調(diào)用abortBroadcast()方法就可以將廣播截斷了撼嗓。
這篇文章就先到這里柬采,下一篇文章Android廣播接收器(三)將介紹本地廣播。由于本人水平有限且警,如有錯誤粉捻,歡迎大家指正。共同學(xué)習(xí)進步斑芜!