BroadcastReceiver没有收到BOOT_COMPLETED


70

我到处都是类似的问题,但是由于某种原因,我的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());
    }
}
}

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


1
盲目猜测-您的接收器不在主程序包中,并且没有package / mainpackage / BootReceiver.java,而是package / mainpackage / receivers / BootReceiver.java,即,接收器的路径错误。
小说

谢谢,我没想检查一下,但是幸运的是它肯定在默认软件包中。
apmeyers1987 2011年

当接收方声明包含android:exported =“ true”会为接收方一起创建新进程时,可能会发生同样的问题。您的记录器(Log.i)会在新的控制台中打印结果,您甚至不会在android监视器(Android Studio)下注意到该结果。我建议删除此声明,除非您知道它的意思。
塞缪尔·罗伯特

Answers:


167

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

开始了:

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

adb或adb shell附带了许多不错的命令。就试一试吧

关于Flo

编辑:哦,该死,我希望这个答案作为“必须每次打开/关闭手机”的答案。对不起乡亲


6
完全不是最初的问题在问什么(所以没有反对意见),但是我发现这很有帮助,谢谢。
CoatedMoose 2012年

13
作为参考,在4.2.2上的adb中运行此命令实际上会重新启动设备
路加(Luke)

9
有史以来最有用的随机答案
Alessandro Roaro 2014年

27
在较新的Android版本上,您需要运行adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.mypackage.name。在不限制向您的应用广播的情况下,设备实际上将重新启动。
刀片

7
我发出此命令时收到以下错误Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED } java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=3566, uid=2000
samsri

151

我发布此消息是希望对尝试过一切但仍无法在安装后使其在启动时运行的人有所帮助,或者它以前曾工作过且不再起作用。

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

<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为防止恶意软件应用而做出的设计决定。Google提倡用户应先从启动器启动一项活动,然后该应用程序才能完成很多工作。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/


8
+1这是一个很好的答案,我没有意识到。信息的一个相关的一点是,由于3.1 “......该系统增加了FLAG_EXCLUDE_STOPPED_PACKAGES所有广播意图。” 这会导致您的答案中所述的情况-但是- “后台服务或应用程序可以通过添加FLAG_INCLUDE_STOPPED_PACKAGES flag应当允许激活已停止的应用程序的广播意图来覆盖此行为。” 我还没有然而测试:P(从链接采取你贴developer.android.com/about/versions/...
大道

12
需要说明的是,一旦用户在您的应用程序中运行了任何活动,以后所有启动后您都将收到BOOT_COMPLETED广播。一个警告是,如果用户在您的应用程序上执行了“强制关闭”,则他们将不得不再次手动启动它,然后您才能再次收到BOOT_COMPLETED广播。
Splaktar 2014年

@Dori您是否可以验证FLAG_INCLUDE_STOPPED_PACKAGES标志的行为?
ARK 2016年

addFlags除非您是第一次启动活动,否则您不能这样做,因此,这不会绕过第一次启动应用程序的需要。
删除

1
更新到新版本后,激活的应用程序是否保持激活状态?通过应用商店还是adb install -r
贝尼贝拉

57

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


终于,我明白了为什么我的应用无法在某些手机上启动时启动,而在其他手机上却可以正常运行-问题是默认情况下选择了哪个存储来安装应用。
Mixaz 2013年

1
我的棒棒糖5.1.1设备也无法正常工作。它认为不启动活动就不可能使用BOOT_COMPLETED。
Venugopal

14

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

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


抱歉,上面的代码有点误导人,因为我只提取了清单的片段,因为它很长,但是使用权限是<manifest>的直接子对象
apmeyers1987

2
+1表示<uses-permission>元素的正确位置。我把它作为<application>的子级来弄错了,该子级在没有警告或错误的情况下进行编译,但是当然不起作用。
父亲栈

10

原来接收者不在清单的标签中。哎呀!感谢您的帮助!测试此问题最糟糕的部分是必须关闭手机并保持开机状态。:P


15
正如我在SO上的其他地方所读到的那样,您无需重新启动,而仅需一个外壳:adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
Vault

6

这似乎是解决此问题的最前线,因此我想为我的C#同事添加解决方案。在尝试了这里的所有内容后,我绞尽脑汁想弄清楚自己在做什么,但无济于事。我终于弄清楚了什么地方出了问题,这和这里有关C#Mono开发的建议有些不同。基本上,可以归结为我刚刚学到的困难方法。使用C#请勿手动修改AndroidManifest.xml!

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

对于这个问题,更直接的方法是完成此操作。

首先,在项目属性的“清单”选项卡下,有一个复选框列表,用于选择要提供的权限,其中之一是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文件。我发现的是,当手动修改清单以包括接收者标签时,系统导致它在一级上查找类太深,从而引发ClassNotFound异常。它试图实例化[Namespace]。[Namespace]。[BroadcastReceiver],这是错误的。之所以这样做,是因为手动进行了清单清单编辑。

无论如何,希望这会有所帮助。

另外,使用adb工具的另一个快速技巧。如果要获取更易于阅读的日志版本,请尝试以下操作:

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

这会将logcat转储到一个文本文件中,您可以打开该文本文件,并且比在命令提示符窗口中阅读还容易一些。使事物的剪切和粘贴也更加容易。


您在小米的MIUI下尝试过吗?
Alexey Subbota'3

1

与某些运行Android Kitkat 4.4.4_r2 / r1的设备有关。

Android中似乎有一个错误使 无法广播android.intent.action.BOOT_COMPLETED

看到:
BOOT FAILURE使Package Manager服务准备就绪

在大多数情况下,这不能解决您的问题(更可能是由于权限等原因),但是如果您运行的是Kitkat,则可以看看是否适合您。

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


在Android 5.1版中,同样的问题是吗?
Ajith KP

那么我们应该怎么做呢?
Slim_user71169

0

将其添加<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>

0

此处的其他答案已经涵盖了如何完美实现广播接收器以使其正常运行,但是在通过按一下应用程序图标从电话/仿真器启动该应用程序时,直到我意识到该应用程序确实可以正常工作时,我仍然无法收到BOOT_COMPLETED Intent。每当我使用Android Studio中的debug / run命令启动我的应用程序时,除非打开并运行该应用程序,否则BOOT_COMPLETED Intent不会传递。

我希望这可以帮助像我一样在这个问题上挣扎数小时的人。而且,如果有人对此行为有一个解释,我将很高兴了解更多有关此行为的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.