BOOT_COMPLETED不工作的Android

首先,我知道有几百个这样的问题,但我已经检查了一会儿,但仍然找不到任何解决办法。

我已经看到这个答案说,BOOT_COMPLETED不发送到应用程序,除非用户启动您的应用程序,Android 3.1之后的版本但我仍然看到一些应用程序正在这样做,一定有办法。 我真的需要处理它,否则我也反对做一些没有用户交互的东西。

所以这是我的AndroidManifest:

<manifest ... > <!-- to be activated service on boot is completed --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application ... > <!-- to receive data when boot completed --> <receiver android:name="myPackage.BootReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest> 

提前致谢。

编辑:在我的广播接收器中看到的东西并不多,但是在这里需要的是:

 package myPackage public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Utils.LogI("BootReceiver", "BootReceiver received!"); if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { // Do my stuff } } } 

这下面的东西为我工作

AndroidManifest.xml中

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application> <receiver android:name=".BootCompletedReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver> <service android:name="NotifyingDailyService" > </service> 

BootCompletedReceiver.class

 public class BootCompletedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { // TODO Auto-generated method stub Log.w("boot_broadcast_poc", "starting service..."); context.startService(new Intent(context, NotifyingDailyService.class)); } } 

Service.class

  public class NotifyingDailyService extends Service { @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent pIntent, int flags, int startId) { // TODO Auto-generated method stub Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show(); Log.i("com.example.bootbroadcastpoc","NotifyingDailyService"); return super.onStartCommand(pIntent, flags, startId); } } 

并为Htc设备添加com.htc.intent.action.QUICKBOOT_POWERON

  <receiver android:enabled="true" android:name=".receivers.BootUpReceiver"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> </intent-filter> </receiver> 

这是一个古老而又基本的问题,但是很多Android开发者现在仍然对这个问题感到困惑,因为他们不会花时间仔细阅读文档

我看到有人分享了一些链接,并说: “这不会工作了” ,这是完全错误的误解

关于这个问题: “我已经看到这个答案说BOOT_COMPLETED不发送到应用程序,除非用户首先启动您的应用程序,在Android版本3.1之后” ,请阅读这些行(从官方文档: https : //developer.android.com/about /versions/android-3.1.html#launchcontrols )正确理解:

  • 请注意, 应用程序的停止状态与“ 活动”的停止状态不同 系统分别pipe理这两个停止的状态。

  • 应用程序在第一次安装时处于停止状态, 但尚未启动,以及用户手动停止(在“ pipe理应用程序”中 )。 (他们的意思是强制停止应用程序)

在这里输入图像描述

  1. 这意味着,用户应该至less在安装后启动应用程序一次,以激活应用程序,然后应用程序可以正常接收来自OS的隐式广播。 ( 只有一次发射!

  2. “任何安装的应用程序, 甚至永远不会打开一次 ?” 是的,这是垃圾邮件和紧急应用程序,这种技术可以帮助用户防止这种情况!

更进一步,直到现在(Android Oreo 8.0) ,当Android限制在Manifest( https://developer.android.com/about/versions/oreo/background.html#broadcasts )注册隐式广播时,几个广播目前仍然被免除这些限制。 BOOT_COMPLETED是他们提到的第一个https://developer.android.com/guide/components/broadcast-exceptions.html

顺便说一下,这是我发现这个问题的最佳解决scheme:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <category android:name="android.intent.category.DEFAULT"/> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <!--For HTC devices--> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> </intent-filter> </receiver> 

最后请仔细阅读文件,并仔细阅读代码一:3

一些新的平板电脑和Android设备默认安全应用程序。 有时这些应用程序会locking您的自动启动模式。 这个安全的应用程序的一个例子是MyAsuspipe理器。 所以你可以添加“允许自动启动”到你的应用程序

问题在于设备。 有些设备只允许内部应用程序接收此操作(例如:Android 5.1)。

你可以添加到你的意图filter作为解决

操作android:name="android.intent.action.USER_PRESENT"

这是在用户解锁设备之后触发的。