关于设置了权限并且监听了RECEIVE_BOOT_COMPLETED广播但还是不能开机启动相应组件的问题,网上找了一些答案,基本上都说的是在正常情况,没有任何意外的情况下开机启动activity或者service,我这里发现一种情况也导致开机后没有调用onReceive()方法,故记录下来供遇到相同情况的朋友们参考。
首先还是在应用程序包里面新建BootBroadcastReceiver类并继承BroadcastReceiver,重写onReseiver()方法,代码如下:
public class BootBroadcastReceiver extends BroadcastReceiver{
private static final String action_boot = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(action_boot))
{
Log.d("onReceive:", "Boot system");
Intent startIntent = new Intent(context,MainActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startIntent);
}
}
}
再在AndroidMenifest.xml添加权限,代码如下:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
android:name="com.example.test.BootBroadcastReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME"/>
</intent-filter>
</receiver>
将程序运行在虚拟机上,运行完成后要注意先退出一次程序手动点击启动一次再通过adb执行如下命令重启虚拟机:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
不出意外虚拟机重启完成软件也跟着启动了,如下:
接下来运行在真机上面,那么问题来了,不同的机型有可能不会启动,是什么原因呢?
经过一番测试我这里发现一个原因,就是虽然在AndroidMenifest.xml里面申明了开机启动权限实际上软件并没有获取这个权限,我用的是三星的机子,发现在设置->应用程序->应用程序权限管理这里面并没有出现Test这个软件相应权限的分配,我尝试着使软件获取另外的权限,比如:短信发送这个权限,我加入了这个权限如下:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
然后我再在三星的机子上面运行这个程序,意外的发现弹出了权限选择这个对话框,如下:
我们看到这个原来这里有一个自动运行的权限选择项,把他打开,点击确定,再重启软件,重启手机后软件自动启动,问题解决。
这是我遇到的开机不能启动的问题,故在此做个记录,同时也供其他朋友参考。
至于为什么加了开机启动权限而没有弹出这个框我也不知道,可能三星机型对此做了什么处理。
在此希望对同样遇到开机不能自动运行的问题的朋友一个帮助。射射~~