欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

荐 Android进阶之路 - 开机自启动

程序员文章站 2022-05-07 19:21:09
android实现程序开机自启动在安卓中,想要实现app开机自动启动,需要实现拦截广播android.permission.RECEIVE_BOOT_COMPLETED,并且需要使用静态注册广播的方法(即在AndroidManifest.xml文件中定义广播)1、先在AndroidManifest.xml文件中定义广播和声明权限上面的MyReceiver是我自己写的类,继承了Br......

经我写Demo测试之后验证了Andorid5.0左右的售货机设备、Android9.0的测试手机都可以实现开机自启动的功能,要注意在篇中代码之外记得允许目标应用自动启动 ~

核心:开机自启动的实现主要在于 android.permission.RECEIVE_BOOT_COMPLETED 这条开机广播

如果是新手不了解四大组件之一广播使用的话, 可以来这补补课 ~ 主要介绍了一些广播的基础知识 ~

如果还想了解系统广播的话,可以来着补补课,昨天刚写的一些系统广播的基础知识 ~

评论区有位做系统级应用的朋友,经他提醒特此补入能收到开机广播的场景(限制:开机广播)

  • 厂商未设置此限制
  • 厂商设置了此限制,但是允许用户进行设置
  • 厂商设置了此限制,但是内置将开机广播加入了白名单

2020.5.20 一生一次,领证的人会不会爆棚啊 ~

加入权限

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

定义广播

主要用于我们接收到系统发送的开机广播后,APP要做的处理 ~

StartReceiver

package nk.com.startappdemo;

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

/**
 * @author MrLiu
 * @date 2020/5/8
 * desc 广播处理
 */
public class StartReceiver extends BroadcastReceiver {
    public StartReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
    	//此处及是重启的之后,打开我们app的方法
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Intent intent= new Intent(context, MainActivity.class);
            //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 非常重要,如果缺少的话,程序将在启动时报错
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //自启动APP(Activity)
            context.startActivity(intent);
            //自启动服务(Service)
			//context.startService(intent);
        }
    }
}

注册广播

AndroidManifest.xml 静态注册广播,配置系统开机的intent-filter ~

<receiver
            android:name=".StartReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
</receiver>

场景测试

简单的一个输出语句,同于效果展示,当值不经意间的插曲 ~

MainActivity

public class MainActivity extends ActionBarActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toast.makeText(this, "哈哈,我成功启动了!", Toast.LENGTH_LONG).show();
        Log.e("AutoRun","哈哈,我成功启动了!");
    }
}

注意要点

  1. 同设备尽可能只允许一个APP实现开机自启动的功能,否则俩者应该会有冲突

  2. 针对Andorid4.0之后需先启动一次APP才可收到开机完成的广播,主要目的是防止恶意程序

  3. 查看设备是否有360之类的安全软件,如有:则再软件请在软件的自启动软件管理中将app设置为【允许】,重启手机,测试是否成功

  4. 查看系统设置里是否自带自启动软件管理的功能 ,如有:将app设置为【允许开机启动】,重启手机,测试是否成功 ~

针对部分机型的设置方式

  • 小米
    打开「安全中心」-> 点击「应用管理」-> 点击「权限」-> 点击「自启动管理」-> 找到「触动精灵」启动开关

  • 中兴/魅族
    打开手机设置 -> 滑到底部找到「应用管理」-> 找到并点击「触动精灵」-> 点击「权限管理」-> 打开「自启动」开关

  • 华为荣耀V8
    方法一:点击「设置」-> 找到并点击「应用管理」-> 找到触动精灵点击「权限」-> 点击「设置单项权限」-> 点击开启「应用自动自动」
    方法二:点击「手机管家」-> 点击「权限管理」-> 找到触动精灵点击「设置单项权限」-> 点击开启「应用自动启动」

  • 三星(安装kingroot)
    打开「kingroot」-> 点击「高级权限管理」-> 点击「自启行为管理」-> 找到触动精灵启动服务开关

  • 其它手机
    通常情况下,自启动权限开关都在应用管理权限设置中,以上仅列出我方现已知的开启方式,欢迎大家补充

  1. 移除任务管理中的app,也称为杀掉app的进程,一般就是俩下Home键盘或者上滑的等操作可以唤出目前在后天的app进程咯 ~

  2. 检查手机是否设置了app安装首选位置是sd卡,据说安装到sd卡的话,因为手机启动成功后(发送了启动完成的广播后)才加载sd卡,所以app接收不到广播。如果是的话,把app安装到内部存储试试。如果不懂得设置的话,那么直接在AndroidManifest.xml文件中设置安装路径,android:installLocation=“internalOnly” - (关于这点未亲自尝试);

如下:

<manifest
    package="cn.weixq.autorun"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="internalOnly">

本文地址:https://blog.csdn.net/qq_20451879/article/details/105790345