這是 Android 四大元件之廣播接收器 BroadcastReceiver 的跨 App 通訊案例,用兩個獨立專案示範:App1 發送自訂廣播,App2 接收這個廣播
1. 核心概念
Android 廣播是一種系統級的訊息發布/訂閱機制:
- 廣播可以跨應用程式發送、接收;既可以接收自訂廣播,也可以接收系統廣播(如開機、電量變化、螢幕鎖定)
- 測試方案:新建 2 個獨立的 Android 專案
- SendDemo:發送自訂廣播的發送端 App
- SendDemo2:接收廣播的接收端 App(截圖中是這個專案)
2. 接收端程式碼(SendDemo2)
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadCastService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 收到廣播時觸發回呼,彈出 Toast 提示
Toast.makeText(context, "已接收到我們自訂的廣播22222", Toast.LENGTH_LONG).show();
}
}
Code language: JavaScript (javascript)
- 必須繼承
BroadcastReceiver,重寫onReceive(),收到廣播時會自動執行這個方法 - 注意:
onReceive中不能做耗時操作,廣播生命週期很短
3. 註冊廣播接收器(兩種方式)
方式一:靜態註冊(在 AndroidManifest.xml 註冊,App 未啟動也能接收,Android 8.0 之後有限制)
<receiver android:name=".MyBroadCastService">
<intent-filter>
<!-- 動作識別碼,發送端必須使用完全相同的 action 字串 -->
<action android:name="com.foxdevelop.MY_CUSTOM_BROADCAST"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
發送端 SendDemo 發送廣播時,Intent 的 action 必須寫成
com.foxdevelop.MY_CUSTOM_BROADCAST,兩邊 action 一致才能收到
方式二:動態註冊(程式碼註冊,App 在執行狀態下才能接收)
MyBroadCastService receiver = new MyBroadCastService();
IntentFilter filter = new IntentFilter("com.foxdevelop.MY_CUSTOM_BROADCAST");
registerReceiver(receiver, filter);
Code language: JavaScript (javascript)
4. 發送端 SendDemo 發送廣播程式碼
// 發送自訂跨應用程式廣播
Intent intent = new Intent("com.foxdevelop.MY_CUSTOM_BROADCAST");
sendBroadcast(intent);
Code language: JavaScript (javascript)
5. 注意事項
- Android 8.0 (API 26) 之後:靜態註冊的自訂隱式廣播會受到限制,很多自訂 action 靜態註冊收不到廣播
- 解決辦法:① 動態註冊;② 發送廣播時帶上套件名稱,使用顯式 Intent
- 系統廣播(網路變化、電量)大部分依然可以正常接收,部分系統廣播也有限制
- 跨應用程式廣播存在安全風險,可以設定權限來控制廣播的收發
6. 執行流程
- 安裝 SendDemo(發送端)、SendDemo2(接收端)兩個 App 到同一支手機/模擬器
- SendDemo 點擊按鈕,呼叫
sendBroadcast發送 action 為com.foxdevelop.MY_CUSTOM_BROADCAST的廣播 - 系統分發這條廣播,所有註冊了這個 action 的 BroadcastReceiver(SendDemo2 裡的 MyBroadCastService)觸發 onReceive
- SendDemo2 彈出 Toast:
已接收到我們自訂的廣播22222
Android 跨應用程式接收廣播