Android應用開機自啟動問題


本文主要介紹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");
   }
  }
 }

(2) 添加manifest配置,添加注冊服務(某些IDE可能需要把name改成BootBroadcastReceiver的完整路徑):

   <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>
 </application>

(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狀態。no broadcast receivedstopped state
具體說明見:
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廣播。

我們還可以利用此命令更精確的發送到某個package:
adb shell am broadcast-aandroid.intent.action.BOOT_COMPLETED-candroid.intent.category.HOME-npackage_name/class_name
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM