Android 跨應用程式接收廣播

這是 Android 四大元件之廣播接收器 BroadcastReceiver 的跨 App 通訊案例,用兩個獨立專案示範:App1 發送自訂廣播,App2 接收這個廣播

1. 核心概念

Android 廣播是一種系統級的訊息發布/訂閱機制:

  1. 廣播可以跨應用程式發送、接收;既可以接收自訂廣播,也可以接收系統廣播(如開機、電量變化、螢幕鎖定)
  2. 測試方案:新建 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. 注意事項

  1. Android 8.0 (API 26) 之後:靜態註冊的自訂隱式廣播會受到限制,很多自訂 action 靜態註冊收不到廣播
    • 解決辦法:① 動態註冊;② 發送廣播時帶上套件名稱,使用顯式 Intent
  2. 系統廣播(網路變化、電量)大部分依然可以正常接收,部分系統廣播也有限制
  3. 跨應用程式廣播存在安全風險,可以設定權限來控制廣播的收發

6. 執行流程

  1. 安裝 SendDemo(發送端)、SendDemo2(接收端)兩個 App 到同一支手機/模擬器
  2. SendDemo 點擊按鈕,呼叫 sendBroadcast 發送 action 為 com.foxdevelop.MY_CUSTOM_BROADCAST 的廣播
  3. 系統分發這條廣播,所有註冊了這個 action 的 BroadcastReceiver(SendDemo2 裡的 MyBroadCastService)觸發 onReceive
  4. SendDemo2 彈出 Toast:已接收到我們自訂的廣播22222

Android 跨應用程式接收廣播

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *