Android App开机自启动

2023-11-04

在这里插入图片描述

最近项目中,有用到开机自启动的功能,这里做一下总结,供大家学习探讨!

Android 开机启动延迟问题
Android 开机自启动被拦截问题

实战演练

测试手机:红米手机 Redmi 6A 安卓version 9
                  华为手机 DUA-AL00 安卓version 8.1.0
                  华为手机 Honor 9i 安卓version 9.1.0
                  VIVO手机 vivo iQOO 安卓version 11
                  小米平板 MI PAD 4 安卓version 8.1.0

                   经测试以上机型测试成功

对于开机自启的基本思路:

  1. 想要实现app开机自启动,我们用广播的方式来实现这种需求。app首先需要去注册一个关于接收发送开机启动的广播(android.intent.action.BOOT_COMPLETED);而且必须要注意的一点是:这个广播必须的静态注册的,不能是动态注册的广播(这种接收开机广播的,一定要静态注册,这样应用还没运行起来时也照样能够接收到开机广播
    ,动态广播就不行了)。
  2. 静态注册好了广播之后,在onReceive方法里面做处理就可以了
  3. 重点注意项
    (1)在安装完应用后,要先运行一次,然后关机,再启动。
    (2)针对Andorid4.0之后需先启动一次APP才可收到开机完成的广播,主要目的是防止恶意程序
    (3)同设备尽可能只允许一个APP实现开机自启动的功能,否则俩者应该会有冲突

具体实现

//加入权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

这里关于onReceive方法里面的处理,有些机型不起作用,这里总结了两种实现方式:
1.根据包名启动应用
2.指定class类,跳转到相应的Activity

/**
 * @author Martin-harry
 * @date 2022/3/4
 * @address
 * @Desc 定义自启动BroadcastReceiver
 */
public class AutoStartBroadReceiver extends BroadcastReceiver {
    private static final String ACTION = "android.intent.action.BOOT_COMPLETED";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("接收广播", "onReceive: ");
        Log.e("接收广播", "onReceive: " + intent.getAction());
        //开机启动
        if (ACTION.equals(intent.getAction())) {
            Log.e("接收广播", "onReceive: 启动了。。。");

//第一种方式:根据包名
//            PackageManager packageManager = context.getPackageManager();
//            Intent mainIntent = packageManager.getLaunchIntentForPackage("com.harry.martin");
//            mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//            context.startActivity(mainIntent);
//            context.startService(mainIntent);


//第二种方式:指定class类,跳转到相应的Acitivity
            Intent mainIntent = new Intent(context, LoginActivity.class);
            /**
             * Intent.FLAG_ACTIVITY_NEW_TASK
             * Intent.FLAG_ACTIVITY_CLEAR_TOP
             */
            mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mainIntent);
//            context.startService(mainIntent);
        }
    }

}

注册广播

       <receiver
            android:name=".receiver.AutoStartBroadReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />

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

        <activity
            android:name=".mvp.view.Activity.LoginActivity"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

场景测试

做完上面的工作后,这里就针对部分手机应用的权限管理操作了

   ComponentName localComponentName = new ComponentName(MyApp.getInstance(), MyInstalledReceiver.class);
   int i = MyApp.getInstance().getPackageManager().getComponentEnabledSetting(localComponentName);
//        Log.e("自启动 >>>>", "onCreate: " + i);
   getAutostartSettingIntent(this);
/**
     * 获取自启动管理页面的Intent
     *
     * @param context context
     * @return 返回自启动管理页面的Intent
     */
    public static Intent getAutostartSettingIntent(Context context) {
        ComponentName componentName = null;
        String brand = Build.MANUFACTURER;
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        switch (brand.toLowerCase()) {
            case "samsung"://三星
                componentName = new ComponentName("com.samsung.android.sm", "com.samsung.android.sm.app.dashboard.SmartManagerDashBoardActivity");
                break;
            case "huawei"://华为
                Log.e("自启动管理 >>>>", "getAutostartSettingIntent: 华为");
                componentName = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity");
//            componentName = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity");//目前看是通用的
                break;
            case "xiaomi"://小米
//                componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity");
                componentName = new ComponentName("com.android.settings","com.android.settings.BackgroundApplicationsManager");
                break;
            case "vivo"://VIVO
//            componentName = new ComponentName("com.iqoo.secure", "com.iqoo.secure.safaguard.PurviewTabActivity");
                componentName = new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity");
                break;
            case "oppo"://OPPO
//            componentName = new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity");
                componentName = new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerUsageModelActivity");
                break;
            case "yulong":
            case "360"://360
                componentName = new ComponentName("com.yulong.android.coolsafe", "com.yulong.android.coolsafe.ui.activity.autorun.AutoRunListActivity");
                break;
            case "meizu"://魅族
                componentName = new ComponentName("com.meizu.safe", "com.meizu.safe.permission.SmartBGActivity");
                break;
            case "oneplus"://一加
                componentName = new ComponentName("com.oneplus.security", "com.oneplus.security.chainlaunch.view.ChainLaunchAppListActivity");
                break;
            case "letv"://乐视
                intent.setAction("com.letv.android.permissionautoboot");
            default://其他
                intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                intent.setData(Uri.fromParts("package", context.getPackageName(), null));
                break;
        }
        intent.setComponent(componentName);
        return intent;
    }

关于红米手机授权操作:

找到红米手机里面的手机管家应用,并打开里面的应用管理

打开授权管理,给自己的应用设置自启动权限,并允许应用在后台弹出界面

关于华为手机授权操作:

总结

本人在测试的时候,红米手机开机自启时间需要等待一段时间,如果有大佬知道怎么解决的,可以下方评论一下,谢谢啦

项目下载地址:AutoBroadCastReceiver_HandlerOOM

题外话:

另外一种实现方式的话,最好就是让系统桌面应用启动你,Launcher
PackageName:comp.xxx.launcher
launcher就是java写的一个app,只不过它是系统应用,但是拿这个代码的话,好像得fw的人帮忙,或者你自己搞出来
具体的也是在Launcher这个的MainActivity里面加个intent 跳转你app的包名

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android App开机自启动 的相关文章

随机推荐

  • 像素鸟html代码,flappy-bird方块版(用小方块替代像素鸟)

    实例简介 flappy bird方块版 实例截图 核心代码 Initialize Phaser and creates a 400x490px game var game new Phaser Game 400 490 Phaser AUT
  • IDEA找不到vue插件下载,使用外部安装vue.js插件的方法

    setting plugins中找不到Vue js插件 使用IDEA时打开Setting gt Plugins找不到vue js插件 看其他网友Marketplace和Installed找不到还会提示Browse repositories
  • 新手学编程必会的100个代码

    前言 我记得刚开始接触编程的时候 觉得太难了 也很好奇 写代码的那些人也太厉害了吧 全是英文的 他们的英文水平一定很好吧 他们是怎么记住这么多代码格式的 而且错了一个标点符号 整个程序都会有影响 一个程序几千行 错一个标点符号都不行这也太难
  • python 代码 给点云增加随机噪音同时保留原有点云

    微信 394467238 有的时候我们需要把原有的点云数据扩充一下 让它的鲁棒性更强 思路很简单 就是先生成一个随机的正态分布的噪音 然后加到点云原有的XYZ数据上面 直接放代码 代码已经运行过了 没有问题 代码中的 std 就是正态分布的
  • 记录一下mac mini 2018 的折腾过程

    更新 昨天手贱在外置雷电SSD中安装了苹果内置SSD的驱动 随即就造成了外置显卡的挂载不上 又折腾了大概三个小时 随后想到了应该是操作系统内部资源竞争 造成不挂载外置显卡 随后删除了内置SSD的驱动 然后才挂载外置显卡成功 还有一点就是 外
  • SendMessage()窗体之间发消息

    SendMessage调用一个窗口的窗口函数 将一条消息发给那个窗口 一 父窗口向子窗口发消息 1 接收方 1 1头文件里面声明消息 define MSG UPDATE LEFT CHILD WM USER 600 1 2消息映射 在头文件
  • halcon基本图像操作

    halcon基本图像操作 阈值分割 取某一个阈值下的某一个区域 获取中心点位置 形态学 膨胀 腐蚀 开运算 闭运算 综合使用 开运算和检测轮廓 字符识别 资源路径 F halcon halconStudy 阈值分割 灰度值 读取图像 转灰度
  • 在线接口测试工具(神器)

    前方高能 请注意 想必大家都用过POSTMAN 进行接口的测试吧 那么接下来我告诉你 你用了这个工具以后 你就不会再想去用POSTMAN了 话不多说了 直接上代码吧 还是那句话 我会尽可能详细的去演示操作过程 避免大家走弯路 123456
  • MySQL阅读网上MySQL文章有感的杂记

    前言 本篇文章将会记录各大MySQL文章的一些有意思的内容摘取 以及一些问题的提问 并且持续更新 并且MySQL专栏将会记录MySQL常考的场景题等实战 问题归类 1 MySQL从加锁范围上分为哪三类 2 全局锁加锁方法的执行命令是什么 主
  • Openwrt的uci接口

    UCI是Unified Configuration Interface的缩写 翻译成中文就是统一配置接口 用途就是为OpenWrt提供一个集中控制的接口 OpenWrt实现的这个工具 能够让你的不管是Lua还是PHP程序 或者SHELL程序
  • 无网络环境,如何部署Docker镜像

    一 简介 无网络环境 部署 Docker 镜像 这通常适用于一些部署环境是脱离网络的公司 或者公司内部有着严格的网络安全要求 且还是 Docker 部署的程序 这个时候怎么办 别急今天就来讲讲 无网络环境 如何部署 Docker 镜像 二
  • awk命令的使用

    1 获取根分区剩余大小 先用df h命令查看磁盘 确定我们需要获取字段的位置 再使用awk命令获取此字段 df h df h awk NR 6 print 4 2 获取当前机器ip地址 ifconfig awk NR 2 print 2 3
  • 终止for循环的方式

    continue break return 1 continue 当程序运行到 continue 语句时 会终止当前的这一次循环 进入下一次的循环中 它 适用于所有的循环结构 for int i 0 i lt 10 i 执行内容 conti
  • stm32F103C8T6 keil5编译完成使用XCOM进行串口打印时乱码

    一 检查波特率 串口调试工具和main c的串口初始化一定要相同 二 检查编码格式 第一步 点击keil5的小扳手图标 修改为Chinese GB2312 Simplified 这样一来 代码的中文就可以显示出来啦 第二步 XCOM这款串口
  • 安装Visio 2013与原本的office冲突的最终解决方案

    一 下载office visio 2013 二 开始安装 但是提示卸载原本的office 三 网上找寻答案 于是按照这篇文章https jingyan baidu com article 19192ad8c1d6dae53e570735 h
  • HashMap常用API及注意事项

    map clear map size map isEmpty map containsKey 判断 map containsValue map get key map put key value map putAll otherMap ma
  • ubuntu18.04安装cmake3.18.0

    ubuntu18 04安装cmake3 18 0 1 本方法可适用安装任何版本的cmake 可以在官网中找到需要的版本 本文以3 18 0为例 https cmake org files 2 wget https cmake org fil
  • Javaweb和微信小程序项目部署阿里云服务器总结(上)

    谈到微信小程序的java后台怎么部署在阿里云服务器上的问题 弯弯绕绕 好多坑 网上的博客资料也特别乱 博主也是在没有任何经验和指导下花了几天的工夫才完成的 这里为了方便大家不踩坑 总结了下整个流程和注意事项 由于篇幅原因 只讲重点的地方 所
  • 软件测试(3)——白盒测试

    文章目录 白盒测试 白盒测试方法 静态测试 人工代码检查 软件度量 其它方法 动态测试 覆盖测试分析 运行时错误检测 覆盖测试 逻辑覆盖方法 路径测试 数据流测试 白盒测试 白盒测试也称结构性测试 逻辑驱动测试 基于程序的测试 特点 将程序
  • Android App开机自启动

    最近项目中 有用到开机自启动的功能 这里做一下总结 供大家学习探讨 Android 开机启动延迟问题 Android 开机自启动被拦截问题 实战演练 测试手机 红米手机 Redmi 6A 安卓version 9 华为手机 DUA AL00