72

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

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

4

9 回答 9

172

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

开始了:

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

adb 或 adb shell 附带了许多不错的命令。去尝试一下

问候弗洛

编辑:哦,该死的,我想要这个答案作为“每次都必须打开/关闭手机”的答案。对不起,伙计们

于 2012-04-11T11:31:49.557 回答
157

我发布此内容是希望它对尝试了所有方法但在安装后仍无法使其在启动时运行或以前可以工作但不再工作的人有所帮助。

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

<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_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/

于 2013-11-08T10:03:38.603 回答
58

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

于 2014-03-30T14:15:13.310 回答
14

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

这是一个示例项目,演示了BOOT_COMPLETED.

于 2011-02-19T16:21:42.517 回答
10

原来接收器不在清单的标签中。哎呀!谢谢你们的帮助!测试这个最糟糕的部分是必须不断关闭和打开电话。:P

于 2011-02-19T20:04:26.513 回答
6

这似乎是这个问题的最前沿线程,所以我想为我的 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
   }
}

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

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

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

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

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

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

于 2013-10-29T15:48:23.510 回答
1

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

Android 中似乎存在一个错误,导致android.intent.action.BOOT_COMPLETED没有被广播。

请参阅:
BOOT FAILURE 使 Package Manager Service 准备就绪

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

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

于 2016-01-05T13:17:51.587 回答
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>
于 2016-04-27T12:40:46.803 回答
0

这里的其他答案已经涵盖了如何完美地实现广播接收器以便它能够工作,但是我仍然在接收 BOOT_COMPLETED Intent 时遇到问题,直到我意识到应用程序在通过按下应用程序图标从手机/模拟器启动时实际上正在工作。每当我使用 Android Studio 中的调试/运行命令启动我的应用程序时,BOOT_COMPLETED Intent 将不会被传递,除非应用程序已打开并正在运行。

我希望这可以帮助像我一样在这个问题上挣扎了几个小时的人。此外,如果有人对这种行为有解释,我很乐意了解更多。

于 2016-11-11T15:39:42.737 回答