天天看點

Android應用如何開機自啟動、自啟動失敗原因

本文主要介紹Android應用如何開機自啟動、自啟動失敗的原因、adb指令發送BOOT_COMPLETED。

問題:應用程式是否可以在安裝後自啟動,沒有ui的純service應用如何啟動?答案馬上揭曉^_*

1、Android應用如何開機自啟動

(1)、在AndroidManifest.xml中注冊

AndroidManifest.xml中注冊BOOT_COMPLETED Action

注意不僅要添加android.intent.action.BOOT_COMPLETED對應的action,還需要添加對應的uses-permission

(2)、Receiver接收廣播進行處理

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class BootBroadcastReceiver extends BroadcastReceiver {

public static final String TAG = "BootBroadcastReceiver";

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction().toString();

if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {

// u can start your service here

Toast.makeText(context, "boot completed action has got", Toast.LENGTH_LONG).show();

return;

}

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狀态,在這種狀态下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES标志,而預設所有系統廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,是以就沒法通過系統廣播自啟動了。是以Android3.1之後

(1)、應用程式無法在安裝後自己啟動

(2)、沒有ui的程式必須通過其他應用激活才能啟動,如它的Activity、Service、Content Provider被其他應用調用。

存在一種例外,就是應用程式被adb push you.apk /system/app/下是會自動啟動的,不處于stopped狀态。

Android應用如何開機自啟動、自啟動失敗原因
Android應用如何開機自啟動、自啟動失敗原因

具體說明見:

<a href="http://developer.android.com/about/versions/android-3.1.html#launchcontrols" target="_blank">http://developer.android.com/about/versions/android-3.1.html#launchcontrols</a>

<a href="http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html" target="_blank">http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html</a>

3、adb發送BOOT_COMPLETED

我們可以通過

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

指令發送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

繼續閱讀