receiver開機自啟動失敗原因
應用開啟自啟動需要下面步驟
(1)在AndroidManifest.xml中註冊廣播
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.autoregistration" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:persistent="true"> <receiver android:name=".AutoRegReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>
(2)在程式碼中實現一個廣播
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class AutoRegReceiver extends BroadcastReceiver { private static final String TAG = AutoRegReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { String receivedAction = intent.getAction(); if (receivedAction.equals(Intent.ACTION_BOOT_COMPLETED)) { // start to do the work. //................. if (DBG) { Log.d(TAG, "Action boot completed received.."); } } } }
備註:個別手機(如華為)需要去手機設定面板開啟 應用自啟動許可權
2、自啟動失敗的原因
接收不到BOOT_COMPLETED廣播可能的原因
(1)、BOOT_COMPLETED對應的action和uses-permission沒有一起新增
(2)、應用安裝到了sd卡內,安裝在sd卡內的應用是收不到BOOT_COMPLETED廣播的
(3)、系統開啟了Fast Boot模式,這種模式下系統啟動並不會傳送BOOT_COMPLETED廣播
(4)、應用程式安裝後重來沒有啟動過,這種情況下應用程式接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
Android3.1之後,系統為了加強了安全性控制,應用程式安裝後或是(設定)應用管理中被強制關閉後處於stopped狀態,在這種狀態下接收不到任何廣播。直到被啟動過(使用者開啟或是其他應用呼叫)才會脫離這種狀態,所以Android3.1之後
(1)、應用程式無法在安裝後自己啟動
(2)、沒有ui的程式必須通過其他應用啟用才能啟動,如它的Activity、Service、Content Provider被其他應用呼叫。
存在一種例外,就是應用程式被adb push you.apk /system/app/下是會自動啟動的,不處於stopped狀態。
使用adb shell 傳送廣播
terminal :
adb shell am broadcast -aandroid.intent.action.BOOT_COMPLETED
執行結果:
Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED }
Broadcast completed: result=0
命令傳送COMPLETED廣播,而不用重啟測試機或模擬器來測試BOOT_COMPLETED廣播,這條命令可以更精確的傳送到某個package,如下:
adb shell am broadcast -aandroid.intent.action.BOOT_COMPLETED-candroid.intent.category.com.qualcomm.qti.autoregistration
執行的結果:
Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED-candroid.intent.category.com.qualcomm.qti.autoregistration }
Broadcast completed: result=0