安卓app开机启动

实现app开发,开机自启app,简易教程

安卓app开机启动

项目需求要实现,程序随手机开机启动

实现原理:

Android系统在开机时,会向所有app发起广播,通知app已经开机了。因此,只需要接受拦截到这个广播就能实现开机自启。

步骤一

  1. 打开全局配置文件AndroidManifest.xml

  2. 添加 android:installLocation="internalOnly"将app安装在内存中,安装在sd卡不知道会不会影响广播信息的接受(暂时未验证)

  3. 添加开机自启权限<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  4. <application></application>中添加,注册系统广播信息接受者

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <category android:name="android.intent.category.HOME" />
    </intent-filter>
    </receiver>

步骤二

  1. java/com.example.包名中,新建MyBroadcastReceiverjava程序

  2. 添加接受广播信息的处理方法onReceive

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package com.example.包名;

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

    public class MyBroadcastReceiver extends BroadcastReceiver {
    private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";

    /**
    * 接收广播消息后都会进入 onReceive 方法,然后要做的就是对相应的消息做出相应的处理
    *
    * @param context 表示广播接收器所运行的上下文
    * @param intent 表示广播接收器收到的Intent
    */

    @Override
    public void onReceive(Context context, Intent intent) {

    /*
    * 如果 系统 启动的消息,则启动 APP 主页活动
    */
    if (ACTION_BOOT.equals(intent.getAction())) {
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
    Toast.makeText(context,"唤醒成功",Toast.LENGTH_LONG).show();
    }
    }
    }

注意事项

  • 手机设置问题手机管家之类的程序可能会阻止app程序开机自启动
  • 第一次安装app后,需手动启动,后续即可自启动
  • Android中规定了BroadCastReceiver不能处理复杂长时间的逻辑操作,如果在onReceive方法在10s内没法执行完毕,则系统会视之为未响应状态,可能会报ANR错误。可以将这些耗时操作放在Service中开辟子线程去执行。