最近这一段时间,一直在和android板子较劲,虽说开发的时候不管是代码量还是页面上,相较于纯做软件的人来说,都少了一些。但扯淡的地方就在于硬件不稳定,不像软件我写1就是1,硬件你可以写的是1,但是结果可能是0。最近做的一个业务上预留了一个静默升级和开机或者断电自启动的功能点。静默升级已经试验正确了,等回头专门写一个来讲述一下,今天说一下开机自启动,简单记一下坑。
首先,开机这个行为,毫无疑问肯定有个系统广播,那思路就是我们去在我们的代码里来个注册一个广播,而且是静态广播来搞一下这个事情基本上就好了。下边来个示例代码哈,我们去继承一个BroadcastReceiver ,然后找到固定的action,即获取到android.intent.action.BOOT_COMPLETED,在里面做个逻辑判断即可。
public class BootCompleteReceiver extends BroadcastReceiver {
public BootCompleteReceiver() {
}
//开机接受广播
@Override
public void onReceive(Context context, Intent intent) {
Logger.d(getClass().getSimpleName(),"开机自启动广播");
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
}
然后再清单文件中在来一波代码,采用静态注册的方式,这个为什么静态就不说原因了,毕竟都是搬砖的熟人了,哈哈
<receiver
android:name=".receiver.BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
然后一把run,可以测试一波,到此基本上就结束了。下面有几个小坑给大家说一下,虽说android板子的开发相对来说自由,因为都是root过的,有最高权限,但是基本的核心逻辑跟软件还是一样的。
1.一个小坑就是,在接受到广播之后,处理开启APP逻辑的时候,Intent.FLAG_ACTIVITY_NEW_TASK,这个非常重要,一定记得写啊,要不然程序会挂的。至于clean要不要写,开心就好。
2.另外一个就是代码没问题,广播也注册了,可是没起作用,这个原因有的时候比较奇怪,后来我查了一些小资料,又自己做了一点测试,要是纯软件的话,可以看看手机自启动权限是不是被设置拦截或者阻止,或者被那啥了,做软件的应该都懂的。另外一个就是老的手机,或者android板子上,安装程序优先选在了sd卡上了,要不设置一波,或者直接改一下配置文件,如下图所示
<manifest
package="cn.weixq.autorun"
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly">
我这开发android板子,的内存卡是外置的,跟老款的手机一样,就是因为上述的问题引起的,改了之后,瞬间飞起来,如果还有其它搬砖的朋友有其它问题导致该广播不起作用,可以留言再交流。