一、前因
今天接到一个需求,就是让程序在设备开机的时候就自己启动,听起来虽然流氓,但是在TV端却是在正常不过的了,刚接到需求的时候心想这simple
二、过程
首先一个实现原理:Android系统中许多操作都会发生很多广播,比如打电话,接收短信,已经开机,充电 等等,我们今天要监听的就是开机广播,开机自启动,一听名字就知道和开机有关,没错,所谓的开机自启动就是监听开机广播之后做出相应的操作,我们先来新建一个广播文件
/**
* 接收开机自启广播
* Created by Administrator on 2017/9/4.
*/
public class BootCompletedReceiver extends BroadcastReceiver {
private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if(ACTION_BOOT.equals(intent.getAction())){
// TODO Auto-generated method stub
//构建Intent
Intent ootStarIntent = new Intent(context,MainActivity.class);
//跳转不加这个会报错
ootStarIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//
context.startActivity(ootStarIntent);
}
}
}
新建的广播里面写你要做的事情,做完这一步我们还需要做什么,没错,就是注册,只有注册了广播才会生效,没有注册的广播不叫广播,叫文件
一般广播的注册方式分为两种
1 :全局注册 全局注册是在项目中的AndroidManifest.xml文件里面注册,一次注册,终身无忧,不管是谁发的 都能收到,安全系数较低
2:局部注册 局部注册为在代码中注册,广播有效性只在本应用中有效,安全系数比较高
此次我们使用的是全局注册方式,毕竟开机广播是系统发的,只有这样你才能接收到
<!--接收开机广播-->
<receiver android:name=".broadcast.BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
最后在加上接收广播的权限
<!--权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
好了,做完这些操作正常情况下你就可以接收到开机广播了,然后为所欲为
,可是 偏偏我就遇到了不正常的情况,广播并没有接收到
具体是什么原因呢?请教了各位大佬以及百度终于找到了解决方案
三、解决方案
原来有的系统只加一个intent-filter是不行的
<!--接收开机广播-->
<receiver android:name=".broadcast.BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
在之前注册的广播中加上这些,接收不到开机广播的问题完美解决啦