1. 程式人生 > >receiver開機自啟動失敗原因

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