BroadcastReceiver 未接收 BOOT_COMPLETED

我在这里查看了类似的问题,但是由于某种原因,BroadcastReceiver 从来没有收到 android.Intent.action.BOOT _ COMPLETED 意图。

这是我的(相对) Android:

<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());
}
}
}

谢谢! 非常感谢您的帮助

103861 次浏览

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

下面是一个示例项目 ,演示了 BOOT_COMPLETED的使用。

结果发现接收器不在旅客名单上。哎呀!谢谢你们的帮助!测试的最糟糕的部分是不得不一直关机和打电话。校对: P

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

开始了:

  • 打开控制台/终端并导航到/平台工具
  • 类型 adb shell或在 linux/mac ./adb shell
  • 在 shell 类型 am broadcast -a android.intent.action.BOOT_COMPLETED或任何您想要触发的操作中

在 adb 或 adb shell 中有很多不错的命令,尝试一下吧

问候 弗洛

编辑: 哦,该死,我想要这个答案作为一个答案“必须打开/关闭手机每一次”。抱歉,各位

这似乎是这个问题的前沿线程,所以我想为我的 C # 同事添加一个解决方案。我绞尽脑汁想弄清楚我做错了什么在这里尝试了一切,但没有用。我最终找出了问题所在,它与这里给 C # Mono 开发的建议稍有不同。基本上,这就是我刚刚通过艰难的途径学到的东西。使用 C # 不要手动修改 AndroidManifest.xml!

请参考以下指南: Xamarin: 使用 AndroidManifest.xml

对于这个问题,更直接的方法是这样做的。

首先,在您的项目属性中,在 Manifest 选项卡下,有一个复选框列表用于选择您想要提供的权限,其中之一是 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
}
}

[ InentFilter ()]处理优先级的最后一部分不是必需的,它只是让其他高优先级的事情在引导时首先完成,如果你的应用程序不是高优先级的事情,这是一个很好的实践。

正如您将在链接的文章中看到的,在代码中使用这些标记将导致在构建时创建 AndroidManifest.xml 文件,并按照应该的方式创建。我发现,当手动修改清单以包含接收者标记时,系统会导致它过深地查找类1级,从而抛出 ClassNotfound 异常。它试图实例化[命名空间]。[命名空间]。这是错误的。它这样做是因为手动清单编辑。

总之,希望这个能帮上忙。

另外,使用 adb 工具的另一个快速提示。如果您想获得一个更容易阅读的日志版本,请尝试以下操作:

C: Android 平台-tools adb logcat > > C: log.txt

这将把 logcat 转储到一个文本文件中,与在命令提示符窗口中相比,您可以更容易地打开和读取这个文件。使剪切和粘贴东西更容易一点。

我发布这篇文章的目的是希望它能对那些尝试了所有方法但仍然无法在安装后启动或者之前工作过但现在不再工作的人有所帮助。

因此,假设您已经添加了许可:

<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 stopped state

当处于“停止”状态时,应用程序 不会因为任何原因而逃跑,除非通过手动启动某个活动。(意味着不会调用 BroadcastRecevier(ACTION_PACKAGE_INSTALLEDBOOT_COMPLETED等等,不管它们已注册的事件是 直到用户手动运行应用程序)。)

这是谷歌为防止恶意软件应用程序而做出的一个设计决定。谷歌主张用户应该首先从启动器启动一个活动,然后应用程序才能做很多事情。在活动启动之前,阻止 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 卡),您将永远不会收到启动完成操作。因此必须在 manifest tag中指定 android:installLocation="internalOnly"

用于修饰或说明一些运行 Android Kitkat 4.4.4 _ r2/r1的设备。

安卓系统中似乎存在一个漏洞,使得 BOOT _ COMPLETED无法广播。

参见:
启动失败使包管理器服务准备就绪

在大多数情况下,这并不能解决您的问题(更有可能是因为权限等) ,但是如果您正在运行 Kitkat,那么您可以查看一下,看看这是否适合您。

我有这个问题和 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 意图,直到我意识到应用程序实际上工作时,从手机/模拟器启动按下应用程序图标。 每当我使用来自 Android Studio 的调试/运行命令启动我的应用程序时,除非应用程序打开并运行,否则 BOOT _ COMPLETED 意图将不会被传递。

我希望这能帮助像我一样,为这个问题苦苦挣扎了几个小时的人。 此外,如果有人对这种行为有任何解释,我真的很高兴知道更多。