廣播分為兩種類型:標準廣播和有序廣播
我們來看一下具體這兩者的具體區別:
1、發送標準廣播
我們需要先定義一個廣播接收器來準備接收此廣播才行,否則也是白發。
新建一個MyBroadcastReceiver,代碼如下:
package com.example.broadcasttest;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 MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();}
}
這里當MyBroadcastReceiver收到自定義的廣播時,就會彈出“received in MyBroadcastReceiver ”的提示。然后在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><receiver android:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application></manifest>
可以看到,這里讓MyBroadcastReceiver接收一條值為com.example.broadcasttest.MY_BROADCAST的廣播,因此待會在發送廣播的時候,我們就需要發出這樣的一條廣播。
修改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>
我們在布局中添加了一個按鈕,用于作為發送廣播的觸發點。
然后修改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);}});}....
}
可以看到,我們在按鈕的點擊事件里面加入了發送自定義廣播的邏輯,首先構建出了一個Intent對象,并把要發送的廣播的值傳入,然后調用了Context的sendBroadcast()方法將廣播發送出去,這樣監聽com.example.broadcasttest.MY_BROADCAST這條廣播的廣播接收器會收到消息。此時發出去的廣播就是一條標準廣播。運行程序,點擊按鈕。

回顧如何發送一條標準廣播,首先你得有個廣播接收器,那我們就新建一個廣播接收器MyBroadcastReceiver,然后在里面添加一個Toast,用于接收后廣播用于反饋,但是我們要在AndroidManifest.xml文件中對這個廣播接收器進行修改,你要接收什么樣得廣播。廣播接收器就差不多做好了。我們開始準備發送廣播,添加一個按鈕,作為觸發點,在按鈕的點擊事件中,添加發送自定義廣播的邏輯。首先肯定要構建出Intent對象,把要發送的廣播的值傳入,然后調用Context的sendBroadcast()方法將廣播發送出去。這樣所有監聽com.example.broadcasttest.MY_BROADCAST這條廣播的廣播接收器就會收到消息。這就是一條標準廣播。
另外,廣播是使用Intent進行傳遞的,因此你還可以在Intent中攜帶一些數據傳遞給廣播接收器。
2、發送有序廣播
廣播是一種跨進程的通信方式,我們在應用程序內發出去的廣播,其他應用程序也是可以接收的。廢話不說,我們要驗證,
新建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();}
}
我們仍然是在廣播接收器的onReceive()方法中彈出了一段文本信息。然后,AndroidManifest.xml中對這個廣播接收器進行修改,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcasttest2"><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><receiver android:name=".AnotherBroadcastReceiver"><intent-filter><action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application></manifest>
可以看到,AndroidBroadcastReceiver接收的仍然是com.example.broadcasttest.MY_BROADCAST這條廣播,把BroadcastTest2運行起來,點擊BroadcastTest1的按鈕,那么你會接收兩條提示信息。
這就證明了,我們的應用程序是可以被其他的應用程序接收到的。
發送有序廣播:
到現在為止,我們程序中發送的都是標準廣播,接下來,我們來發送有序廣播,重新回到Broadcast項目,然后修改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);intentfiletr = new IntentFilter();intentfiletr.addAction("android.net.conn.CONNECTIVITY_CHANGE");networkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver,intentfiletr);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");//注意這里的值一定要和BroadCastTest中的一樣。sendOrderedBroadcast(intent,null);//這里由sendBroadcast()方法變化。}});}........
}
只是將sendBroadcast()方法改成sendOrderBroadcast()方法,sendOrderBroadcast()方法接收兩個參數,第一個參數仍然是Intent,第二個參數是一個與權限相關的字符串,這里傳入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">//我們給廣播接收器設置了優先級<action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application></manifest>
可以看到我們通過android:priority屬性給廣播接收器設置了優先級,優先級高的廣播接收器就可以先收到廣播,這里將MyBroadcastReceiver的優先級設成100,以保證它一定會在AnotherBroadcastReceicer之前收到廣播。
既然我們已經獲得了接收廣播的優先權,那么MyBroadCastReceiver就可以選擇時候允許廣播繼續傳遞了。
修該MyBroadcastReceiver中的代碼,如下:
package com.example.broadcasttest;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 MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show(); abortBroadcast();//調用abortBroadcast()方法。}
}
如果在onReceive()方法中調用了abortBroadcast()方法,就表示這條廣播截斷,優先級的廣播接收器就無法收到這條廣播。
重新運行程序。
只有MyBroadcastReceiver中的廣播接收器的Toast信息框可以彈出。