Android BroadcastReceiver未接收启动\u已完成

Android BroadcastReceiver未接收启动\u已完成,android,broadcastreceiver,boot,Android,Broadcastreceiver,Boot,我在这里到处寻找类似的问题,但出于某种原因,我的广播接收器从未接收到android.intent.action.BOOT\u完成的意图 这是我的(相对)Android.Manifest文件: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <receiver android:name=".BootReceiver"

我在这里到处寻找类似的问题,但出于某种原因,我的广播接收器从未接收到android.intent.action.BOOT\u完成的意图

这是我的(相对)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>
谢谢!非常感谢您提供的任何帮助

您的
元素需要是
元素的直接子元素,您上面列出的代码表明它不是


演示如何使用
BOOT\u COMPLETED

,结果表明接收方不在清单的标记中。哎呀!谢谢你们的帮助,伙计们!测试这一功能最糟糕的部分是必须不断关闭和打开手机P

通过adb连接到设备并打开设备外壳,可以模拟所有广播操作

我们开始:

  • 打开控制台/终端并导航到/平台工具
  • 键入
    adb shell
    或在linux/mac上键入
    /adb shell
  • 在shell类型
    am broadcast中-一个android.intent.action.BOOT\u已完成
    或任何您想要启动的操作
adb或adb shell附带了许多漂亮的命令。试试看

问候 弗洛


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

这似乎是这个问题的最前沿线索,所以我想为我的C#同事添加一个解决方案。我绞尽脑汁想弄清楚我在这里做了什么错事,但都没有用。我终于找出了问题所在,这与这里关于C#Mono开发的建议有些不同。基本上,这可以归结为我刚刚通过艰苦的方式学到的东西。使用C#不要手动修改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
   }
}
[IntentFilter()]处理优先级的最后一部分不是必需的,它只是让其他更高优先级的事情在引导时首先完成,如果你的应用程序不是高优先级的东西,这是一个很好的实践

正如您将在链接的文章中看到的,在代码中使用这些标记将导致在构建时创建AndroidManifest.xml文件,并以应有的方式创建它。我发现,当手动修改清单以包含receiver标记时,系统导致它查找一级类的深度过深,从而引发ClassNotFound异常。它试图实例化[Namespace].[Namespace].[BroadcastReceiver],这是错误的。它之所以这样做,是因为手工编辑清单

不管怎样,希望这有帮助

另外,还有一个关于adb工具的快速提示。如果要获得更易于阅读的日志版本,请尝试以下操作:

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


这将把logcat转储到一个文本文件中,您可以比在命令提示符窗口中更轻松地打开和读取该文件。也使剪切和粘贴变得更容易。

我发布这篇文章的目的是希望它对那些尝试过所有东西但安装后仍无法在引导下运行的人有所帮助,或者它以前可以工作,但现在已经不工作了

因此,假设您已添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
从Android 3.1开始,所有应用程序在安装时都处于“停止”状态(这与用户强制从设置应用程序停止应用程序后应用程序的状态相同)

处于“停止”状态时,应用程序将不会出于任何原因运行,除非手动启动活动。(意味着在用户手动运行应用程序之前,
不会调用
broadcastReceiver
ACTION\u-PACKAGE\u-INSTALLED
BOOT\u-COMPLETED
等,无论他们注册的事件是什么,

这是谷歌为防止恶意软件应用而做出的一项设计决定。谷歌主张用户应首先从启动器启动一项活动,然后该应用程序才能发挥作用。在该活动启动之前,阻止
BOOT_COMPLETED
交付是该论点的逻辑结果

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

更多详细信息:



如果您的应用程序安装在外部存储(SD卡),您将永远不会收到启动完成操作。因此,您必须在
清单标签中指定与运行android Kitkat 4.4.4R2/r1的某些设备相关的
安卓:installLocation=“internalOnly”

Android中似乎存在一个bug,使得Android.intent.action.BOOT\u已完成无法播放

请参阅:

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

我遇到了这个问题,android.intent.action.BOOT\u COMPLETED在它启动的某些时候根本不会被广播!

在我的清单文件中添加
可以解决我的问题并起作用

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

这里的其他答案已经涵盖了如何完美地实现广播接收器,使其工作,但是我仍然无法接收引导完成的意图,直到我通过按下应用图标从手机/模拟器启动应用程序时才意识到该应用程序实际工作。 每当我使用和中的调试/运行命令启动应用程序时
<receiver android:name="com.example.startuptest.StartUpBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
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");
            ...
        }
    }
}
<receiver android:name=".BroadCastRecieverClass">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </receiver>