BroadcastReceiver没有收到BOOT_COMPLETED

我已经在这里寻找类似的问题,但由于某种原因,我的BroadcastReceiver永远不会收到android.intent.action.BOOT_COMPLETED Intent。

这是我的(相对)Android.Manifest文件:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true" android:label="BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> 

这是实际的接收器。

 public class BootReceiver extends BroadcastReceiver { private static final String TAG="BootReceiver"; @Override public void onReceive(Context context,Intent intent){ try{ context.startService(new Intent(context,ConnectivityListener.class)); Log.i(TAG,"Starting Service ConnectivityListener"); }catch(Exception e){ Log.e(TAG,e.toString()); } } } 

谢谢! 任何帮助是极大的赞赏

您可以通过adb连接到设备来模拟所有广播操作,并打开设备shell。

开始了:

  • 打开控制台/terminal并导航到/ platform-tools
  • 键入adb shell或linux / mac ./adb shell
  • 在shelltypesam broadcast -a android.intent.action.BOOT_COMPLETED或任何你想要触发的行动

adb或adb shell有一堆很好的命令。 去尝试一下

问候Flo

编辑:哦该死的,我想这个答案作为“不得不每次打开/closures电话”的答案。 对不起大家

我发布这个,希望对于那些尝试了一切的人来说是有帮助的,但是在安装之后还是无法启动运行,或者之前已经工作了,并且不再工作。

所以假设你已经添加了权限:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

并注册您的接收器:

 <receiver android:name="com.example.startuptest.StartUpBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

并编码您的BroadcastReceiver

 public class StartUpBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED"); ... } } } 

Android 3.1开始,所有应用程序在安装时都处于“ 停止 ”状态(这与应用程序从“设置”应用程序中强制停止之后,应用程序结束的状态相同)。

Android停止状态

处于“停止”状态时,应用程序不会以任何理由运行 ,除非手动启动活动。 (意思是在用户手动运行应用程序之前 ,无论是否有已注册的事件,都不会调用BroadcastRecevierACTION_PACKAGE_INSTALLEDBOOT_COMPLETED等)。

这是Google为防止恶意软件应用而做出的一项devise决定。 谷歌曾经主张,用户应该首先从启动器启动一个活动,然后应用程序可以做很多事情。 防止BOOT_COMPLETED被传递,直到活动启动是该参数的逻辑结果。

一旦用户在您的应用程序中运行任何活动一次,您将在未来的所有引导后收到BOOT_COMPLETED广播。

更多细节:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/

如果您的应用安装在外部存储(SD卡)上 ,则永远不会收到Boot Complete操作。 所以你必须在manifest tag指定android:installLocation="internalOnly"

原来接收器不在清单的标签中。 哎呦! 谢谢你们的帮助! 关于testing这个最糟糕的部分是不得不closures电话。 :P

你的<uses-permission>元素需要是<manifest>元素的直接子元素,而你上面的代码表明它不是。

这是一个演示使用BOOT_COMPLETED 的示例项目 。

这似乎是这个问题的最前线,所以我想为我的C#同事添加一个解决scheme。 在我尝试了一切之后,我绞尽脑汁想弄清楚自己做错了什么,但无济于事。 我终于弄清楚了什么是错误的,这与C#Mono开发的build议有点不同。 基本上,这归结为我刚刚学到的东西。 用C#不要手动修改AndroidManifest.xml!

请参阅本指南以供参考: Xamarin:使用AndroidManifest.xml

更直接的这个问题,这里是你如何做到这一点。

首先,在您的项目属性中,在清单标签下,有一个checkbox列表,用于select要提供的权限,其中一个是RECEIVE_BOOT_COMPLETED。 检查提供这些权限。

其次,你需要把正确的标签放在你的BroacastReceiver类上。

 [BroadcastReceiver] [IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)] public class MyBootReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { // Do your boot work here, set alarms, show toasts, whatever } } 

[IntentFilter()]处理优先级的最后部分不是必需的,它只是让其他更高优先级的东西在启动时首先完成,如果您的应用程序不是高优先级的事情,这是很好的做法。

正如您在链接文章中所看到的,在您的代码中使用这些标记将会导致在构build时创buildAndroidManifest.xml文件,并以一切应有的方式进行创build。 我发现当手动修改清单以包含接收者标记时,系统导致它查找太深的类,从而抛出ClassNotFoundexception。 它试图实例化[Namespace]。[Namespace]。[BroadcastReceiver]这是错误的。 这是因为手动清单编辑。

无论如何,希望这有助于。

此外,与adb工具的另一个快速提示。 如果你想得到一个更容易阅读的日志版本,试试这个:

C:\ Android \ platform-tools \ adb logcat >> C:\ log.txt

这将转储logcat到一个文本文件,你可以打开和阅读比在命令提示符窗口更容易一点。 使剪切和粘贴的东西也容易一点。

涉及运行Android Kitkat 4.4.4_r2 / r1的一些设备。

在Android中似乎有一个错误,使得android.intent.action.BOOT_COMPLETED不被广播。

看到:
启动失败,使包pipe理器服务准备就绪

在大多数情况下,这不是你的问题的答案(更可能是因为权限等),但如果你正在运行Kitkat,那么你可能会看看,看看是否这样的情况。

我有这个问题, android.intent.action.BOOT_COMPLETED将不会播放一些时间,它已经启动了!

在我的清单文件中添加<category android:name="android.intent.category.HOME" />解决我的问题,并工作。

 <receiver android:name=".BroadCastRecieverClass"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver> 

其他答案已经介绍了如何完美地实现广播接收器,以便它能够工作,但是我仍然遇到了BOOT_COMPLETED Intent问题,直到我意识到应用程序实际上是从电话/仿真器上按下应用程序图标开始工作的。 每当我从Android Studio启动我的应用程序的debugging/运行命令BOOT_COMPLETED意向将不会交付,除非应用程序打开并运行。

我希望这能帮助像我这样的人在这个问题上挣扎数小时。 而且,如果有人对这种行为有一个解释,我会很高兴知道更多。

我有同样的问题。 这是在清单接收器的名称更改为我的类的完整path后解决: com.bla.bla.bla.Receiver

Interesting Posts