BroadcastReceiver没有收到BOOT_COMPLETED

apm*_*987 66 boot android broadcastreceiver

我在这里寻找类似的问题,但由于某种原因,我的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>
Run Code Online (Sandbox Code Playgroud)

这是实际的接收器.

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());
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

fkl*_*pan 163

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

开始了:

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

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

关心弗洛

编辑:哦该死的,我想把这个答案作为"每次必须打开/关闭电话"的答案.对不起大家

  • 在较新的Android版本上,您需要运行`adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.mypackage.name`.在不限制广播到您的应用的情况下,您的设备实际上会重启. (23认同)
  • 作为参考,在4.2.2的adb中运行它实际上将重启您的设备 (13认同)
  • 最有用的随机答案 (9认同)
  • 根本不是最初的问题是什么(所以没有upvote),但是,我发现这非常有帮助,谢谢你. (6认同)
  • 在我的设备上所有工作正常.您是否拥有清单文件中的权限:<uses-permission android:name ="android.permission.RECEIVE_BOOT_COMPLETED"/> (4认同)
  • 当我发出这个命令时,我收到以下错误:Broadcasting:Intent {act = android.intent.action.BOOT_COMPLETED} java.lang.SecurityException:Permission Denial:不允许从pid =发送广播android.intent.action.BOOT_COMPLETED 3566,uid = 2000` (4认同)
  • 在我的情况下它没有"-p"工作像这样:广播-a android.intent.action.BOOT_COMPLETED com.mypackage.name (3认同)
  • 对于以下异常:`java.lang.SecurityException:Permission Denial:不允许发送广播android.intent.action.BOOT_COMPLETED`,您需要将adb更改为root:`./adb root`,然后`adb shell am Broadcast -a android .intent.action.BOOT_COMPLETED -p yourpackage.app` 将会起作用。 (2认同)
  • 输入“adb shell am Broadcast -a android.intent.action.ACTION_BOOT_COMPLETED”反而为我启动了启动广播。 (2认同)

Can*_*ner 144

我发布这个是希望它对那些已经尝试了所有东西但仍然无法让它在安装后在启动时运行或以前曾经工作并且不再工作的人会有所帮助.

假设您已添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)

并注册您的接收器:

<receiver android:name="com.example.startuptest.StartUpBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

编码你的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");
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Android停止状态

处于"已停止"状态时,除了手动启动活动外,应用程序不会以任何理由运行.(意味着没有BroadcastRecevier(ACTION_PACKAGE_INSTALLED,BOOT_COMPLETED等等将被调用的而不考虑他们所登录的事件,直到用户手动运行该应用.)

这是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/

  • 应该澄清的是,一旦用户在您的应用程序中运行一次任何活动,您将在所有未来的启动后收到BOOT_COMPLETED广播.需要注意的是,如果用户对您的应用程序执行强制关闭,则必须再次手动启动它,然后才能再次收到BOOT_COMPLETED广播. (12认同)
  • +1这是一个很好的答案,我不知道这一点.一个相关的信息位是从3.1 _"...系统将**FLAG_EXCLUDE_STOPPED_PACKAGES`添加到**所有**广播意图."_这导致你的答案中描述的情况 - 但是 - _"后台服务或应用程序**可以通过将`FLAG_INCLUDE_STOPPED_PACKAGES标志'添加到应该被允许激活已停止的应用程序的广播意图来覆盖**这种行为."_我还没有测试这个:p(取自您发布的链接http://开发人员.android.com /约/版本/ Android的3.1.html#launchcontrols) (8认同)
  • 已激活的应用程序更新到新版本后是否仍保持激活状态?通过应用商店或“adb install -r”? (2认同)
  • 这也适用于系统应用程序吗? (2认同)

Sun*_*501 55

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

  • 哇,最后的答案是一座山下的钻石:D (3认同)

Com*_*are 12

您的<uses-permission>元素必须是元素的直接子<manifest>元素,并且上面的代码列表表明它不是.

这是一个演示如何使用的示例项目BOOT_COMPLETED.

  • +1表示<uses-permission> -element的正确位置.我把它作为<application>的孩子而没有警告或错误编译,但当然没有用,我弄错了. (2认同)

apm*_*987 11

原来接收器不在清单的标签中.哎呦!谢谢你的帮助!关于测试这个问题的最糟糕的部分是不得不继续关闭和打开手机.:P

  • 当我在其他地方读到SO时,你不需要重启但只需要一个shell:`adb shell am broadcast -a android.intent.action.BOOT_COMPLETED` (13认同)
  • 我不懂男人..你做了什么工作呢? (3认同)

Wan*_*eer 5

这似乎是解决此问题的最前线,因此我想为我的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
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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