Android 第二十课 广播机制(大喇叭)----发送自定义广播(包括发送标准广播和发送有序广播)
廣播分為兩種類型:標準廣播和有序廣播
我們來看一下具體這兩者的具體區(qū)別:
1、發(fā)送標準廣播
我們需要先定義一個廣播接收器來準備接收此廣播才行,否則也是白發(fā)。
新建一個MyBroadcastReceiver,代碼如下:
這里當MyBroadcastReceiver收到自定義的廣播時,就會彈出“received in MyBroadcastReceiver ”的提示。然后在AndroidManifest.xml中對這個廣播接收器進行修改:
可以看到,這里讓MyBroadcastReceiver接收一條值為com.example.broadcasttest.MY_BROADCAST的廣播,因此待會在發(fā)送廣播的時候,我們就需要發(fā)出這樣的一條廣播。
修改activity_main.xml中的代碼,如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.broadcasttest.MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content" android:text="Send Broadcast"/></LinearLayout>我們在布局中添加了一個按鈕,用于作為發(fā)送廣播的觸發(fā)點。
然后修改MainActivity中的代碼:
package com.example.broadcasttest;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast;public class MainActivity extends AppCompatActivity {private IntentFilter intentfiletr;private NetworkChangeReceiver networkChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);.... ???????? Button button = (Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent);}});}.... } 可以看到,我們在按鈕的點擊事件里面加入了發(fā)送自定義廣播的邏輯,首先構建出了一個Intent對象,并把要發(fā)送的廣播的值傳入,然后調(diào)用了Context的sendBroadcast()方法將廣播發(fā)送出去,這樣監(jiān)聽com.example.broadcasttest.MY_BROADCAST這條廣播的廣播接收器會收到消息。此時發(fā)出去的廣播就是一條標準廣播。運行程序,點擊按鈕。
回顧如何發(fā)送一條標準廣播,首先你得有個廣播接收器,那我們就新建一個廣播接收器MyBroadcastReceiver,然后在里面添加一個Toast,用于接收后廣播用于反饋,但是我們要在AndroidManifest.xml文件中對這個廣播接收器進行修改,你要接收什么樣得廣播。廣播接收器就差不多做好了。我們開始準備發(fā)送廣播,添加一個按鈕,作為觸發(fā)點,在按鈕的點擊事件中,添加發(fā)送自定義廣播的邏輯。首先肯定要構建出Intent對象,把要發(fā)送的廣播的值傳入,然后調(diào)用Context的sendBroadcast()方法將廣播發(fā)送出去。這樣所有監(jiān)聽com.example.broadcasttest.MY_BROADCAST這條廣播的廣播接收器就會收到消息。這就是一條標準廣播。
另外,廣播是使用Intent進行傳遞的,因此你還可以在Intent中攜帶一些數(shù)據(jù)傳遞給廣播接收器。
2、發(fā)送有序廣播
廣播是一種跨進程的通信方式,我們在應用程序內(nèi)發(fā)出去的廣播,其他應用程序也是可以接收的。廢話不說,我們要驗證,
新建BroadcastTest2項目。當然我們還需要在這個項目中新建一個廣播接收器,用于接收上一次的自定義廣播,
新建AnotherBroadcastReceiver,代碼如下:
package com.example.broadcasttest2;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast;/*** Created by ZHJ on 2018/3/11.*/public class AnotherBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show();} }我們?nèi)匀皇窃趶V播接收器的onReceive()方法中彈出了一段文本信息。然后,AndroidManifest.xml中對這個廣播接收器進行修改,代碼如下:
可以看到,AndroidBroadcastReceiver接收的仍然是com.example.broadcasttest.MY_BROADCAST這條廣播,把BroadcastTest2運行起來,點擊BroadcastTest1的按鈕,那么你會接收兩條提示信息。
這就證明了,我們的應用程序是可以被其他的應用程序接收到的。
發(fā)送有序廣播:
到現(xiàn)在為止,我們程序中發(fā)送的都是標準廣播,接下來,我們來發(fā)送有序廣播,重新回到Broadcast項目,然后修改MainActivity中的代碼,如下所示:
只是將sendBroadcast()方法改成sendOrderBroadcast()方法,sendOrderBroadcast()方法接收兩個參數(shù),第一個參數(shù)仍然是Intent,第二個參數(shù)是一個與權限相關的字符串,這里傳入null就行了。重新運行程序,這兩個應用程序仍然可以接收到這條廣播。
但是這時候的廣播接收器是有先后順序的,而且前面的廣播接收器還可以將廣播截斷,以阻止其傳播。
那么該如何設定廣播接收器的先后順序呢?當然是在注冊的時候進行設定的,修改AndroidManifest.xml中的代碼:
如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcasttest"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name = "android.permision.RECEIVE_BOOT_COMPLETED"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter android:priority="100">//我們給廣播接收器設置了優(yōu)先級<action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application></manifest>可以看到我們通過android:priority屬性給廣播接收器設置了優(yōu)先級,優(yōu)先級高的廣播接收器就可以先收到廣播,這里將MyBroadcastReceiver的優(yōu)先級設成100,以保證它一定會在AnotherBroadcastReceicer之前收到廣播。
既然我們已經(jīng)獲得了接收廣播的優(yōu)先權,那么MyBroadCastReceiver就可以選擇時候允許廣播繼續(xù)傳遞了。
修該MyBroadcastReceiver中的代碼,如下:
如果在onReceive()方法中調(diào)用了abortBroadcast()方法,就表示這條廣播截斷,優(yōu)先級的廣播接收器就無法收到這條廣播。
重新運行程序。
只有MyBroadcastReceiver中的廣播接收器的Toast信息框可以彈出。
總結
以上是生活随笔為你收集整理的Android 第二十课 广播机制(大喇叭)----发送自定义广播(包括发送标准广播和发送有序广播)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十五期:一个用户至少“值”100美元,
- 下一篇: 前端学习(476):web前端行业介绍