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理应用程序”中 )。 (他们的意思是强制停止应用程序)
-
这意味着,用户应该至less在安装后启动应用程序一次,以激活应用程序,然后应用程序可以正常接收来自OS的隐式广播。 ( 只有一次发射! )
-
“任何安装的应用程序, 甚至永远不会打开一次 ?” 是的,这是垃圾邮件和紧急应用程序,这种技术可以帮助用户防止这种情况!
更进一步,直到现在(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"
这是在用户解锁设备之后触发的。