本文主要介紹Android應用如何實現開機自啟動、自啟動失敗的原因以及通過ADB命令模擬發送BOOT_COMPLETED開機廣播。
1、Android應用如何實現開機自啟動
(1) 實現一個廣播類,接收android系統開機完成時發出的廣播:
//開機自啟動廣播接收
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String TAG = "BootBroadcastReceiver";
static final String action_boot = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction().toString();
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
LetvLog.v(TAG, "wq->[onReceive] ACTION_BOOT_COMPLETED!");
ServiceCtrl.startCtrlService(context, "testId");
}
}
}
<application
android:icon="@drawable/icon"
android:allowBackup="true"
android:persistent="true"
android:label="同屏服務" >
<!-- 開機自啟動廣播接收 -->
<receiver android:name=
".BootBroadcastReceiver"
>
<intent-filter>
<action android:name=
"android.intent.action.BOOT_COMPLETED"
/>
</intent-filter>
</receiver>
(3) 配置中添加啟動權限:
<!--開機啟動權限-->
<uses-permission android:name=
"android.permission.RECEIVE_BOOT_COMPLETED"
/>
2、其他相關系統廣播
- 關機廣播:
<action android:name="android.intent.action.ACTION_SHUTDOWN"/>
- 重啟廣播:
重啟時會先發送ACTION_SHUTDOWN關機廣播,然后發送:
<action android:name="android.intent.action.REBOOT"/>
3、自啟動失敗可能的原因-接收不到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狀態。
具體說明見:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html
4、開機廣播測試,可用ADB發送BOOT_COMPLETED(無需反復重啟機器來測試)
我們可以通過如下命令:
adb shell am broadcast-aandroid.intent.action.BOOT_COMPLETED
命令發送BOOT_COMPLETED廣播,而不用重啟測試機或模擬器來測試BOOT_COMPLETED廣播。