實現開機自啟動時,BroadcastReceiver 收到 BOOT_COMPLETED 廣播啟動 Service,卻提示「很抱歉,程式已停止運行」,而手動啟動 App 正常。經排查為 AndroidManifest.xml 中 Receiver 類完整包名拼寫錯誤。
<receiver android:name=".MyBroadcastReceive"> <!-- 錯誤:假設包名為 com.example.app,實際類在 com.example.app.receiver -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name="com.example.app.receiver.MyBroadcastReceive"> <!-- 必須寫完整包名,或確保類在 manifest package 同級目錄 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
android:name 必須是完整包名 + 類名(如 com.pkg.MyReceiver),或以點開頭表示同包下(.MyReceiver),但類必須確實在該包下。RECEIVE_BOOT_COMPLETED 權限不可漏。android:exported="true"(接收系統廣播必須導出)。WatchDogService 類需存在且在 Manifest 註冊。adb shell am broadcast -a android.intent.action.BOOT_COMPLETED 模擬開機廣播,無需重啟手機即可驗證 Receiver 邏輯。BootReceiver 標籤,查看 onReceive 是否執行、是否拋出異常。
Manifest 配置錯誤是組件無法啟動的首要原因,開發時建議用「複製完整類名」功能避免手寫拼寫錯誤。