实现思路:
安卓实现开机自启动的思路就是注册广播。
(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)检查你的手机或平板,在设置-权限管理-找到你的应用-开启应用自动启动(如果你的手机有这个选项的话请按照此步骤开启)我的是以华为平板为例。
(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了
以上就是我开发过程中暂时遇到的问题,以及解决思路,如果有那里不够完善还请多多指教