跳到主要内容

开机启动应用

8.1. 修改代码的方式

8.1.1. 非 Launcher

  • 在应用源码里的AndroidManifest.xml添加如下内容

    package="com.example.testfile"
    android:sharedUserId="android.uid.system">


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


    <receiver android:name="com.example.testfile.BootBroadcastReceiver" >
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </receiver>
  • 增加广播接收的代码BootBroadcastReceiver.java,比如

    package com.example.testfile;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    import android.widget.Toast;

    public class BootBroadcastReceiver extends BroadcastReceiver &#123;
    private static final String TAG = "sjft";

    public static final String EXTRA_VOLUME_STATE = "android.os.storage.extra.VOLUME_STATE";

    public static final int STATE_UNMOUNTED = 0;
    public static final int STATE_CHECKING = 1;
    public static final int STATE_MOUNTED = 2;
    public static final int STATE_MOUNTED_READ_ONLY = 3;
    public static final int STATE_FORMATTING = 4;
    public static final int STATE_EJECTING = 5;
    public static final int STATE_UNMOUNTABLE = 6;
    public static final int STATE_REMOVED = 7;
    public static final int STATE_BAD_REMOVAL = 8;

    @Override
    public void onReceive(Context context, Intent intent) &#123;
    // TODO Auto-generated method stub
    String action = intent.getAction();
    if (action.equals("android.intent.action.PACKAGE_REPLACED"))&#123;
    String packageName = intent.getData().getSchemeSpecificPart();
    Log.v(TAG,"BootBroadcastReceiver packageName:"+packageName);
    if(context.getPackageName().equals(packageName))&#123;
    Intent launchIntent = new Intent(context, MainActivity.class);//重新启动应用
    //此处如果不想写死启动的Activity,也可以通过如下方法获取默认的启动Activity
    //Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(launchIntent);
    &#125;
    &#125; else if (action.equals("android.intent.action.BOOT_COMPLETED")) &#123;
    Intent launchIntent = new Intent(context, MainActivity.class);//重新启动应用
    //此处如果不想写死启动的Activity,也可以通过如下方法获取默认的启动Activity
    //Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(launchIntent);
    &#125;
    &#125;
    &#125;
  • 开机自启动 apk 需要系统签名(系统签名文件)

  • 必须先打开一次开机自启动 apk,才能接收到开机完成的广播

8.1.2. Launcher

  • 删除或者不编译 SDK 里的 Launcher 应用

  • 在应用源码里的AndroidManifest.xml里最先启动的 Activity 添加如下内容

    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>