1. 程式人生 > >Android App開機自動啟動的實現

Android App開機自動啟動的實現

暮鼓集    行走集

原作於2014年01月28日

在開發Android行業應用過程中,常會要求App在系統開機時可以自動啟動。這裡,我將實現方法和遇到的一些問題總結於下文。

一. 實現

繼承一個BroadcastReceiver用來處理BOOT_COMPLETED廣播訊息

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction().toString();
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
  ...
        }
    }
}

在AndroidManifest.xml中註冊

<receiver android:name=".MyReceiver" >
    <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

二. 不能自動啟動的原因

  1. AndroidManifest.xml中BOOT_COMPLETED部分不正確,或者缺少必要的uses-permission。

  2. 應用安裝到了sd卡內,安裝在sd卡內的應用不能收到BOOT_COMPLETED。

  3. 系統開啟了Fast Boot模式,這種模式下系統啟動不會發送BOOT_COMPLETED。

  4. 應用程式安裝後重來沒有啟動過,這種情況下應用程式接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。

所有,有些應用只有Background Service,而不包括任何Activity,是不能啟動的。

Android3.1之後,系統為了加強了安全性控制,應用程式安裝後或是(設定)應用管理中被強制關閉後處於Stopped狀態,在這種狀態下接收不到任何廣播,直到被啟動過(使用者開啟或是其他應用呼叫)才會脫離這種狀態。要注意,如果使用者在應用管理器中Force Stop,則應用又會回到Stopped狀態。

但是應用程式作為系統App,被安裝在/system/app/下是會自動啟動的,不處於stopped狀態。

三. 對應用程式進行測試

可以使用如下命令傳送BOOT_COMPLETED。

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

而不用重啟測試機或模擬器來測試BOOT_COMPLETED廣播,這條命令可以更精確的傳送到某個package,如下:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name

參考

http://developer.android.com/about/versions/android-3.1.html#launchcontrols http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html http://www.trinea.cn/android/android-boot_completed-not-work/