### Broadcast 與 BroadcastReceiver 基本概念 * Broadcast 是 Android 中一種系統或 App 廣播的訊息,可被多個 App 接收。 * 不同於 Intent 只發送給單一組件,Broadcast 是系統層級的事件傳遞機制。 * App 可註冊 BroadcastReceiver 來接收這些事件,不會自動開啟介面。 * 範例情境包括開機完成、飛航模式切換、來電通知等。 --- ### 建立與註冊 BroadcastReceiver(以飛航模式為例) * 建立一個類別繼承自 `BroadcastReceiver`,並覆寫 `onReceive()`。 * 使用 `Intent.ACTION_AIRPLANE_MODE_CHANGED` 作為觸發的條件判斷。 * 透過 `Settings.Global.getInt()` 判斷飛航模式是否開啟。 * 在 Activity 的 `onCreate()` 中以 `registerReceiver()` 註冊接收器。 * 在 `onDestroy()` 中呼叫 `unregisterReceiver()` 避免記憶體洩漏。 --- ### 動態與靜態 BroadcastReceiver 差異 * **動態接收器**:使用 `registerReceiver()` 於 App 執行時註冊,App 關閉即無效。 * **靜態接收器**:在 `AndroidManifest.xml` 宣告,App 即使未啟動仍可接收(有使用限制)。 * 靜態接收器僅允許少數系統事件(如開機完成),避免常駐服務耗電。 * 若廣播需由特定 App 接收,可透過 Intent 指定 `package` 達成靜態收訊。 --- ### 傳送廣播(Send Broadcast) * 使用 `sendBroadcast()` 搭配 `Intent` 傳送自定義廣播。 * 可自訂 Action,例如 `"test_action"` 作為識別符號。 * 可加上 Extras 傳送額外資料;亦可指定目標 App 的 `packageName`。 --- ### 建立測試用 Receiver 處理自訂廣播 * 建立一個 `TestReceiver` 類別並繼承 `BroadcastReceiver`。 * 判斷收到的 Intent 是否為 `"test_action"`。 * 於 Activity 中註冊 `TestReceiver`,指定自訂 Action 的 `IntentFilter`。 * 測試廣播功能是否在對應 App 中成功接收並印出 Log。 --- ### 跨 App 廣播限制與可用條件 * 接收端 App 必須處於開啟狀態,否則無法接收動態廣播。 * 若需在 App 關閉時仍接收,需符合靜態接收器的系統允許條件。 * 若使用靜態接收器,建議明確指定目標 App 的 `packageName` 增加穩定性。 --- ### 實務應用建議 * 使用動態接收器處理使用者操作期間的即時事件(如來電、充電狀態)。 * 使用靜態接收器處理系統層級事件(如開機、自動啟動同步)。 * 注意記憶體釋放,動態註冊後應在適當生命週期解除註冊。 * 撰寫多 App 溝通邏輯時,需考慮接收條件、權限與生命週期。 # 選擇題 1. 在 Android 中,Broadcast 是什麼? A. 用於建立多執行緒的 API B. 系統或應用發出的系統級事件 C. 一種資料庫操作方式 D. 專門傳送通知的方式 **答案:B** 2. Broadcast 與一般 Intent 的最大差異是? A. Broadcast 只能啟動 Activity B. Broadcast 只能在主執行緒執行 C. Broadcast 可以發送給多個應用程式 D. Intent 是不可序列化的 **答案:C** 3. 若想接收飛航模式變更事件,需監聽哪個 Action? A. `Intent.ACTION_POWER_CONNECTED` B. `Intent.ACTION_BOOT_COMPLETED` C. `Intent.ACTION_AIRPLANE_MODE_CHANGED` D. `Intent.ACTION_SCREEN_ON` **答案:C** 4. BroadcastReceiver 中接收到的 `intent` 可用來? A. 建立新的 Broadcast B. 判斷是何種事件觸發 C. 取得系統配置 D. 啟動服務 **答案:B** 5. 下列哪個是 BroadcastReceiver 的必要覆寫方法? A. `onStart()` B. `onReceive()` C. `onCreate()` D. `onResume()` **答案:B** 6. 如果你希望在裝置開機完成時啟動同步行為,應監聽哪個廣播? A. `Intent.ACTION_BOOT_COMPLETED` B. `Intent.ACTION_POWER_CONNECTED` C. `Intent.ACTION_SCREEN_ON` D. `Intent.ACTION_USER_PRESENT` **答案:A** 7. 如果要動態註冊 BroadcastReceiver,應使用哪個方法? A. `startActivity()` B. `startService()` C. `registerReceiver()` D. `sendBroadcast()` **答案:C** 8. 在 `registerReceiver()` 中必須提供哪兩個參數? A. Context 和 Intent B. ViewModel 和 Activity C. Receiver 實例與 IntentFilter D. Service 與 Intent **答案:C** 9. 在哪個生命週期應呼叫 `unregisterReceiver()`? A. `onStart()` B. `onResume()` C. `onPause()` D. `onDestroy()` **答案:D** 10. 哪個方法可用來觸發廣播? A. `notifyObservers()` B. `launchBroadcast()` C. `sendBroadcast()` D. `runOnUiThread()` **答案:C** 11. 要讓應用程式接收靜態廣播(Static Receiver),需要在哪裡宣告? A. ViewModel 中 B. AndroidManifest.xml C. build.gradle D. MainActivity.kt **答案:B** 12. 下列哪一種廣播無法透過靜態方式接收? A. BOOT\_COMPLETED B. PACKAGE\_ADDED C. AIRPLANE\_MODE\_CHANGED D. 自定義明確廣播(explicit broadcast) **答案:C** 13. 對於 `AIRPLANE_MODE_CHANGED`,若要取得開關狀態,應查詢哪個設定? A. `Settings.Secure.AIRPLANE_MODE` B. `Settings.Global.AIRPLANE_MODE_ON` C. `Settings.System.AIRPLANE_MODE_STATUS` D. `Settings.Secure.DEVICE_MODE` **答案:B** 14. 靜態 BroadcastReceiver 有哪些限制? A. 僅能由 Activity 接收 B. 無法設定 IntentFilter C. 僅可監聽部分系統廣播 D. 無法於背景接收 **答案:C** 15. `BroadcastReceiver` 接收到廣播時是否能直接啟動 UI? A. 可以直接顯示畫面 B. 僅能更新 Notification C. 應避免直接顯示畫面 D. 必須使用 Service 啟動 UI **答案:C** 16. 在 BroadcastReceiver 中呼叫 `context.getContentResolver()` 是為了? A. 啟動新的 Activity B. 存取系統設定值 C. 呼叫網路 API D. 建立資料庫 **答案:B** 17. 什麼是 Dynamic Receiver? A. 在編譯期註冊的 Receiver B. 可於應用程式執行期間註冊與反註冊 C. 不需 IntentFilter D. 僅可靜態宣告 **答案:B** 18. 使用 sendBroadcast 傳送自定義廣播時應? A. 傳遞 View 元件 B. 指定 receiver 的 ID C. 建立一個包含自定義 Action 的 Intent D. 改寫 Application 類別 **答案:C** 19. 下列哪個是 IntentFilter 的用途? A. 傳遞資料給 broadcast B. 篩選可接收的廣播 Action C. 儲存系統設定值 D. 記錄廣播次數 **答案:B** 20. 若要從 App A 傳送廣播給 App B,App B 應? A. 宣告靜態 service B. 註冊 Receiver 並指定相同的 action C. 在 Gradle 中依賴 App A D. 使用 ActivityResult API **答案:B** 21. 靜態 Receiver 與 Dynamic Receiver 的最大差異是? A. 是否能接收自定義廣播 B. 是否需要權限 C. 是否需要手動註冊 D. 是否可在 app 關閉時接收 **答案:D** 22. 若 App 關閉後仍需接收廣播,應使用哪種方式? A. ViewModel + LiveData B. 靜態註冊 Receiver C. Navigation Graph D. DataStore **答案:B** 23. 為何 Android 限制靜態 Receiver 的使用? A. 系統不支援該功能 B. 影響 UI 呈現 C. 為減少耗電與效能負擔 D. 安全性問題 **答案:C** 24. 可透過 intent.getAction() 比對哪個條件? A. 螢幕旋轉方向 B. 收到的廣播 action C. 對應的 activity name D. 應用名稱 **答案:B** 25. 為了模擬飛航模式切換事件,可以在哪裡操作? A. Gradle 設定檔 B. Emulator 設定中 C. AndroidManifest D. runOnUiThread 區塊 **答案:B** 26. 下列哪個情況需在 AndroidManifest 中加入權限? A. 接收 BOOT\_COMPLETED B. 接收自定義廣播 C. 註冊 Dynamic Receiver D. 呼叫 intent.action.MAIN **答案:A** 27. 自定義 Broadcast Action 建議遵循哪種命名方式? A. 全部小寫 B. 使用反斜線 C. 類似 package 結構的 URI 格式 D. 只能用數字 **答案:C** 28. 若兩個 App 需透過 Broadcast 溝通,Sender 應注意什麼? A. 指定 exact Package Name(若要發送給特定 app) B. 設定 mutable state C. 檢查 Layout direction D. 使用 Jetpack Navigation **答案:A** 29. IntentFilter 可同時設定多個 Action 嗎? A. 否 B. 是,可呼叫多次 addAction() C. 只能一個 D. 只能在 Service 使用 **答案:B** 30. 若想透過 Broadcast 控制另一個應用的狀態,最穩定的做法為? A. 使用靜態 receiver 並指定 action B. 使用通知 C. 使用 mutableLiveData D. 使用 Retrofit **答案:A** --- # Terminology * Broadcast:系統或應用程式發送的訊息,可由多個應用程式接收並回應 * Broadcast Receiver:用於接收並處理 Broadcast 的 Android 元件 * Dynamic Broadcast Receiver:在執行階段透過 `registerReceiver()` 註冊的接收器,當應用程式處於活動狀態時有效 * Static Broadcast Receiver:在 AndroidManifest.xml 中宣告的接收器,即使應用程式未啟動也可接收符合條件的廣播 * Intent:用於傳遞動作或資料的訊息物件,可攜帶額外資料 * Intent Filter:定義接收哪些類型 Intent 的過濾器,依 action、data、category 決定 * `Intent.ACTION_AIRPLANE_MODE_CHANGED`:當飛航模式狀態變更時由系統發送的廣播 * `Intent.ACTION_BOOT_COMPLETED`:系統啟動完成後由系統發送的廣播,僅允許靜態註冊 * `sendBroadcast()`:從應用程式主動發送一個 Broadcast * Custom Action(自訂 Action):開發者定義的 Intent action 字串,用於自訂廣播識別 * `onReceive(Context, Intent)`:BroadcastReceiver 的唯一抽象方法,於接收廣播時執行 * `Settings.Global.AIRPLANE_MODE_ON`:系統設定鍵,用於查詢飛航模式是否啟用 * `ContentResolver`:Android 提供的資料介面,允許查詢系統設定等資料 * `Settings.Global.getInt(...)`:取得系統設定中整數型值 * `Log.d(...)` / `println(...)`:用於在除錯時輸出訊息至 Logcat 或控制台 * `registerReceiver()`:註冊動態 BroadcastReceiver 並提供 IntentFilter * `unregisterReceiver()`:取消註冊 BroadcastReceiver,避免記憶體洩漏 * AndroidManifest.xml:應用程式的宣告檔,可靜態註冊 Receiver 或宣告權限 * `<receiver>` 標籤:用於靜態註冊 BroadcastReceiver 的 XML 標籤 * `<intent-filter>` 標籤:定義靜態接收器接受的 Intent Action * Application Context:註冊 Receiver 時建議使用的 Context,以確保生命週期一致 * Package-scoped Broadcast:指定目標 Package 的廣播,只傳送至該應用程式 * Broadcast Extras:附加於 Intent 的鍵值對資料,可在接收端取用 * Inter-app Communication:應用程式之間透過 Broadcast 機制傳遞訊息 * System-wide Broadcast:由系統發出的廣播,可同時傳送至多個應用 * Explicit Broadcast:指定接收端應用或元件的廣播,僅目標接收者會收到 * Implicit Broadcast:未指定目標,根據 Intent Filter 傳遞給所有相符應用 * Security Restriction(Android 8+):對靜態接收器的限制,非明確目標的靜態接收器僅允許處理特定廣播 * Android 8.0 行為變更:隱式廣播靜態註冊受限,鼓勵使用動態註冊 * Broadcast Throttling:系統對頻繁廣播的限制措施,用以節省電力與效能 * Lifecycle-aware Receiver:可感知生命週期的接收器,與 ViewModel 或 Lifecycle 互動 * `LocalBroadcastManager`(已棄用):用於應用內部的輕量級廣播傳遞機制 * BootReceiver:常見的靜態廣播接收器,用於裝置開機後初始化任務 * `android.permission.RECEIVE_BOOT_COMPLETED`:接收 BOOT\_COMPLETED 廣播所需權限 * `BroadcastReceiver` 類別:Android 提供的廣播接收抽象類別 * `Context.sendBroadcast()`:從任何 Context 發送廣播 * `Intent.setPackage()`:限制廣播接收對象至特定應用程式 * 多應用廣播測試:建立多個應用接收相同廣播以驗證跨應用傳遞行為 * `Intent.getAction()`:取得 Intent 的動作字串,用於判斷廣播來源 * `Intent.getExtras()`:取得 Intent 附加資料 * `Intent.putExtra()`:在 Intent 中加入額外資料供接收方取用 * `BroadcastReceiver.isOrderedBroadcast()`:判斷是否為有序廣播 * 有序廣播(Ordered Broadcast):可由多個接收者依優先順序處理且可中止傳遞 * 無序廣播(Normal Broadcast):所有匹配接收器同時接收,無傳遞順序 * `abortBroadcast()`(已棄用):中止有序廣播繼續傳遞的 API * `setResultCode()` / `setResultData()`:於有序廣播中設定回傳結果 * `BroadcastReceiver.goAsync()`:允許接收器延遲完成處理,適用於非同步操作 * `PendingIntent.getBroadcast()`:產生可延遲執行的廣播 Intent,常用於通知或鬧鐘 * AlarmManager + BroadcastReceiver:搭配使用以指定時間觸發事件 * 開發工具 Logcat:檢視廣播觸發與處理記錄的重要除錯工具 * Emulator 模擬廣播事件:例如模擬飛航模式變更測試接收器反應 * `Activity.onCreate()`:適合註冊動態接收器的初始化階段 * `Activity.onDestroy()`:取消註冊接收器的最佳時機 * 多廣播註冊管理:可於同一 Activity 中註冊多個接收器處理不同 Action * `ContextWrapper`:提供 BroadcastReceiver 註冊與取消的實作支援 * `BroadcastReceiver.peekService()`:用於檢查廣播中附帶的 Service 是否存在 * `android:exported` 屬性(Manifest):宣告 Receiver 是否允許其他應用觸發 * 測試與驗證工具:使用 adb 指令或模擬器 UI 測試廣播傳送與接收邏輯 * adb shell am broadcast:透過命令列發送廣播以供測試用途 * 可擴充廣播架構:可於多模組應用中分離接收器邏輯提高模組化 * 功耗最佳化:Android 限制廣播目的是減少背景喚醒與電池消耗 * `BroadcastReceiver` 與 Jetpack Compose 整合:透過 ViewModel 與 State 管理連動 UI * 背景任務觸發:使用廣播作為事件觸發器啟動 Job、Service 或 WorkManager * `android.intent.action.MY_PACKAGE_REPLACED`:應用更新後的廣播 * Intent.ACTION\_PACKAGE\_ADDED / REMOVED:應用安裝或解除安裝時的系統廣播 * `Build.VERSION.SDK_INT`:判斷 Android 版本以調整接收器註冊策略 * 執行緒考量:BroadcastReceiver 的 onReceive 預設執行於主執行緒,不適合長時間任務 * Broadcast 防濫用策略:避免過度發送或註冊過多接收器以影響系統效能 * 接收器排程替代方案:可考慮使用 WorkManager 或 JobScheduler 處理非即時任務 * 開發者模式測試限制:模擬器或裝置中可能需允許廣播權限以完整驗證行為 * Android API 版本兼容性:廣播行為與註冊方式因版本差異而異,需留意文件變更 * BroadcastReceiver 的最佳實踐:僅於需要時啟用接收器並正確管理其生命週期 * 安全性考量:接收敏感廣播時應檢查權限與來源以防止惡意操作 * Custom Permission for Broadcast:可定義自訂權限保護敏感廣播行為 * Manifest 合法性驗證:靜態接收器需正確宣告權限、Intent Filter 與 Exported 屬性 * 應用間安全通訊:可透過 package 指定、權限驗證等機制提升廣播傳遞安全性
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up