我在这里寻找类似的问题,但由于某种原因,我的BroadcastReceiver永远不会收到android.intent.action.BOOT_COMPLETED意图。
这是我的(相对)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());
}
}
}
谢谢!非常感谢任何帮助
答案 0 :(得分:163)
您可以通过adb连接到设备并打开设备外壳来模拟所有广播操作。
我们走了:
adb shell
或在linux / mac ./adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED
中的adb或adb shell附带了许多不错的命令。试试吧
此致 FLO
编辑:哦,该死的,我想把这个答案作为“每次必须打开/关闭电话”的答案。抱歉的家伙
答案 1 :(得分:138)
我发布这篇文章是希望它对那些已经尝试过所有内容的人有所帮助,但是在安装之后仍然无法让它在启动时运行,或者之前曾经工作过,而且不再有效。
假设您已添加权限:
<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 开始,所有应用程序在安装时都处于“已停止”状态。(这与应用程序结束后的状态相同用户强制 - 从“设置”应用程序中停止应用程序。)
当处于“已停止”状态时,应用程序将无法以任何理由运行,除非手动启动活动。 (含义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/
答案 2 :(得分:55)
如果您的应用安装在外部存储(SD卡)上,您将永远不会收到启动完成操作。因此,您必须在android:installLocation="internalOnly"
中指定manifest tag
。
答案 3 :(得分:12)
您的<uses-permission>
元素必须是<manifest>
元素的直接子元素,上面的代码列表表明它不是。
Here is a sample project演示使用BOOT_COMPLETED
。
答案 4 :(得分:11)
原来接收器不在清单的标签中。哎呦!谢谢你的帮助!关于测试这个问题的最糟糕的部分是不得不继续关闭和打开手机。 :P
答案 5 :(得分:5)
这似乎是这个问题的最前沿线程,所以我想为我的C#同事添加一个解决方案。在我尝试了一切之后,我绞尽脑汁想弄清楚我做错了什么,无济于事。我终于找出了什么是错的,它与C#Mono开发的建议略有不同。基本上,它归结为我刚刚学到的东西。使用C#不要手动修改AndroidManifest.xml!
请参阅本指南以供参考: Xamarin: Working with 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()]的最后部分不是必需的,它只是让其他更高优先级的东西在启动时首先完成,如果你的App不是高优先级的话,这是很好的做法。
正如您在链接文章中看到的那样,在代码中使用这些标记将导致在构建时创建AndroidManifest.xml文件,其中包含应有的一切。我发现当手动修改清单以包含接收器标记时,系统导致它查找类太一级的类,从而抛出ClassNotFound异常。它试图实例化[Namespace]。[Namespace]。[BroadcastReceiver]这是错误的。由于手动清单编辑,它正在这样做。
无论如何,希望这有帮助。
另外,使用adb工具的另一个快速提示。如果您想获得更容易阅读的日志版本,请尝试以下方法:
C:\ Android \ platform-tools \ adb logcat&gt;&gt; C:\ log.txt的
这会将logcat转储到您可以打开的文本文件,并且比在命令提示符窗口中读取更容易一些。使事物的剪切和粘贴也更容易。
答案 6 :(得分:1)
与运行Android Kitkat 4.4.4_r2 / r1。
的某些设备有关Android中似乎存在一个错误,使得 android.intent.action.BOOT_COMPLETED 没有被广播。
请参阅:
BOOT FAILURE making Package Manager Service ready
在大多数情况下,这不是你的问题的答案(更可能是因为权限等),但如果你正在运行Kitkat,那么你可能会看一下,看看你的情况是否正好。
我遇到了这个问题,并且 android.intent.action.BOOT_COMPLETED 根本就没有在它启动的时候进行广播!
答案 7 :(得分: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>
答案 8 :(得分:0)
此处的其他答案已经涵盖了如何完美地实现广播接收器以便它能够正常工作,但是我仍然遇到问题,直到我意识到应用程序实际工作时才按下电话/模拟器在应用程序图标上。 每当我使用Android Studio的debug / run命令启动我的应用程序时,除非应用程序已打开并运行,否则BOOT_COMPLETED Intent将无法发送。
我希望这可以帮助像我一样在这个问题上挣扎数小时的人。 此外,如果有人对此行为有解释,我会非常乐意了解更多相关信息。