鍍金池/ 問答/Android  HTML/ 安裝APP后不啟動(dòng),如何實(shí)現(xiàn)開機(jī)啟動(dòng)APP的Activity或者Service?

安裝APP后不啟動(dòng),如何實(shí)現(xiàn)開機(jī)啟動(dòng)APP的Activity或者Service?

我們知道,在Android中實(shí)現(xiàn)開啟啟動(dòng)的方法注冊一個(gè)靜態(tài)廣播去監(jiān)聽開機(jī)啟動(dòng)完畢的廣播,然后在接聽到開機(jī)廣播完畢后,啟動(dòng)Activity或者Service,方法如下:
首先,新建一個(gè)廣播監(jiān)聽器監(jiān)聽開機(jī)啟動(dòng)完畢的廣播

public class BootCompletedReceiver extends BroadcastReceiver {

    private static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
 
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(action_boot)){
            Intent intent=new Intent(context,MainActivity.class);
            ootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
}

然后,在AndroidManifest.xml靜態(tài)注冊該廣播

<receiver android:name=".BootCompletedReceiver">
        <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.HOME" />
        </intent-filter>
</receiver>

最后,在AndroidManifest.xml申請權(quán)限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

通過以上的方法,可以實(shí)現(xiàn)開啟啟動(dòng)APP,但是,這個(gè)方法有問題,以上的方法必須要在安裝APP后,手動(dòng)運(yùn)行一次APP后,APP才能接收到android.intent.action.BOOT_COMPLETED廣播。

假如APP沒有Activity,只有Service,或者安裝完畢后無法手動(dòng)運(yùn)行,也不能通過其他的APP來啟動(dòng)此APP的Service或者Activity,如何安裝后,可以開機(jī)啟動(dòng)呢? PS:在可以修改Android系統(tǒng)代碼的基礎(chǔ)上,又有哪些方法呢?

回答
編輯回答
毀與悔

APP接收不到BOOT_COMPLETED廣播可能的原因,有以下幾種:

  1. BOOT_COMPLETED對應(yīng)的actionuses-permission沒有一起添加
  2. 應(yīng)用安裝到了sd卡內(nèi),安裝在sd卡內(nèi)的應(yīng)用是收不到BOOT_COMPLETED廣播的
  3. 系統(tǒng)開啟了Fast Boot模式,這種模式下系統(tǒng)啟動(dòng)并不會(huì)發(fā)送BOOT_COMPLETED廣播
  4. 應(yīng)用程序安裝后重來沒有啟動(dòng)過,這種情況下應(yīng)用程序接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。

Android3.1之后,系統(tǒng)為了加強(qiáng)了安全性控制,應(yīng)用程序安裝后或是(設(shè)置)應(yīng)用管理中被強(qiáng)制關(guān)閉后處于stopped狀態(tài),在這種狀態(tài)下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES標(biāo)志,而默認(rèn)所有系統(tǒng)廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就沒法通過系統(tǒng)廣播自啟動(dòng)了。
所以Android3.1之后:

  1. 應(yīng)用程序無法在安裝后自己啟動(dòng)
  2. 沒有ui的程序必須通過其他應(yīng)用激活才能啟動(dòng),如它的Activity、Service、Content Provider被其他應(yīng)用調(diào)用。

不過,存在一種例外,就是應(yīng)用程序被adb push you.apk /system/app/下是會(huì)自動(dòng)啟動(dòng)的,不處于stopped狀態(tài)。

http://developer.android.com/...
http://commonsware.com/blog/2...

也就是說,解決方式就是將APK推送到/system/app目錄下,或者打包系統(tǒng)時(shí),將APK放置到/system/app中打包

2017年10月27日 01:06