关于安卓开机自启动的方案(最高测试9.0系统管用)

实现思路:

安卓实现开机自启动的思路就是注册广播。
(1)首先清单文件AndroidManifest.xml中添加权限:

 <!--声明接收启动完成广播的权限-->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

(2)其次注册广播:

 <receiver
            android:name="com.md.bowlingbiggerscreen.utils.BootCompleteReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <!-- 开机广播 -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
              <!--  <category android:name="android.intent.category.DEFAULT" />-->
            </intent-filter>
            <intent-filter>
                <!-- 关机广播 -->
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
            <!--    <category android:name="android.intent.category.DEFAULT" />-->
            </intent-filter>
            <!-- 解锁广播 -->
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
              <!--  <category android:name="android.intent.category.DEFAULT" />-->
            </intent-filter>
            <!--亮屏-->
            <intent-filter>
                <action android:name="android.intent.action.ACTION_SCREEN_ON" />
              <!--  <category android:name="android.intent.category.DEFAULT" />-->
            </intent-filter>
            <!--熄屏-->
            <intent-filter>
                <action android:name="android.intent.action.ACTION_SCREEN_OFF" />
                <!--<category android:name="android.intent.category.DEFAULT" />-->
            </intent-filter>
        </receiver>

(3)Receiver类

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

import com.md.bowlingbiggerscreen.MainActivity;

/**
 * 描 述:
 * 作 者:文阿花  2021-06-23 10:24
 * 修改描述:
 * 修 改 人:
 * 修改版本:
 */
public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
//        if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
        Log.i("开机自启==", "我接收到广播啦");
        Intent it = new Intent(context, MainActivity.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(it);
//        }
        switch (intent.getAction()){
            case Intent.ACTION_BOOT_COMPLETED:
                Log.i("开机自启==","手机开机了");
                break;
            case  Intent.ACTION_SHUTDOWN:
                Log.i("开机自启==","手机关机了");
                break;
            case Intent.ACTION_SCREEN_ON:
                Log.i("开机自启==","亮屏");
                break;
            case Intent.ACTION_SCREEN_OFF:
                Log.i("开机自启==","息屏");
                break;
            case Intent.ACTION_USER_PRESENT:
                Log.i("开机自启==","手机解锁");
                break;
        }
    }

}

遇到问题:

一切准备就绪,然后接下来就开始遇到各种问题了,代码都没问题但是如果app依旧无法自启动,可以从以下几点找问题:
(1)广播必须要静态注册
(2)网上有的人说app无法自启是因为Receiver类和activity类不在一个包下,移到一个包下就可以了,但是我没遇到这种情况。
(3)应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的。
具体可以使用以下方法进行验证:

 /**
     * 判断包名所对应的应用是否安装在SD卡上
     * @param packageName
     * @return, true if install on SD card
     */
    public static boolean isInstallOnSDCard(String packageName,Context mcontext) {
        PackageManager pm = mcontext.getPackageManager();
        ApplicationInfo appInfo;
        try {
            appInfo = pm.getApplicationInfo(packageName, 0);

            if ((appInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
                return true;
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        return false;
    }

(4)系统开启了Fast Boot刷机模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播
(5)app安装后,需要首先启动一次,否则是收不到任何广播的。
(6)检查你的手机或平板,在设置-权限管理-找到你的应用-开启应用自动启动(如果你的手机有这个选项的话请按照此步骤开启)我的是以华为平板为例。

关于安卓开机自启动的方案(最高测试9.0系统管用)_第1张图片
(7)查看你的手机或者平板,是否安装有手机管家之类软件,如果有的话打开关键软件查看是否有自启管理的选项,如果有的话,点击自启管理,在应用列表中找到你要自启的app,然后设置允许。
(8)开发过程中,一直无法实现自启,我还有考虑过会不会是安卓8.0以后取消大部分静态注册广播的原因,后来查了资料发现并不是。
Android 8.0新特性-取消大部分静态注册广播

这套代码在华为手机(安卓4.4.4系统)、华为平板(安卓7.0系统),以及电视(TV端安卓9.0系统)上都是可以实现的。

关于TV app开机自启动

关于开发电视app开机自启动方案整理如下:

  • 方案一:使用当贝助手或者氧气桌面
    网上很多这种设置教程,但是我买回来的电视盒子,安装了当贝和氧气之后 ,当贝助手设置了我需要的app开机自启,但是没有作用,氧气桌面设置里面直接找不到所谓的自启选项,这个方案应该是有的电视是可以的,有的不行。这个可能也是跟电视盒子的系统有关,这个只是我的推测,没有具体验证。
  • 方案二:找卖家定制系统
    常见的电视盒子,有的系统设置里面支持app开机自启动,有的则没有。
    我买了电视盒子回来发现,自带的电视系统根本不支持设置开机自启,于是找到卖家,表示后续可能会大量购进一批电视盒子,然后卖家二话不说给我重新发了一个刷机软件还有系统包
    方案三:就是文章一开始的,使用代码实现开机自启动
    但是问题是在安卓9.0系统上,使用开机广播实现app自启动的话,会比较慢,从显示桌面到打开app,大概要用到一分钟到一分半的时间,如果不介意这个时间差的话,代码实现还是可以的,方案二里面是显示了桌面就立马自启了,所以如果要求比较严格的话可以使用方案二,但方案二的问题是,有的时候可能商家会不给你,或者是要求你出钱定制系统,之前问的一家商家就是告诉我要定制系统,并且要购买够一定的量,所以具体的就靠你跟商家battle了

以上就是我开发过程中暂时遇到的问题,以及解决思路,如果有那里不够完善还请多多指教

你可能感兴趣的:(Android,android)