我有两个完全可以控制的应用程序。两者都使用相同的证书进行签名,并且都使用完全相同的intent过滤器。一个从片段发送广播,另一个假设接收它并做一些事情。然而,这不起作用:
Strings.FILTER_INIT_REGISTER = "com.app.FILTER_INIT_REGISTER"
Intent intent = new Intent(Strings.FILTER_INIT_REGISTER);
getActivity().sendBroadcast(intent);
我已在包含ReportingReceiver类的应用的Manifest应用标记中注册了接收器:
<receiver
android:name=".receivers.ReportingReceiver"
android:exported="true"
>
<intent-filter>
<action android:name="com.app.FILTER_INIT_REGISTER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
很好奇为什么ReportingReceiver类没有得到意图调用?
答案 0 :(得分:14)
如果您的应用程序只有服务和接收器,那么这将无法在Android 3.1及更高版本中使用。原因是系统不会向 STOPPED STATE 中的应用程序发送广播Intents。首次安装时,应用程序处于 STOPPED STATE 状态。当用户第一次手动启动应用程序时,它将从 STOPPED STATE 中删除。如果用户强制应用程序停止使用应用程序管理器工具,它将返回 STOPPED STATE 。
由于您的应用程序没有活动,因此用户无法“启动”它。因此它永远不会出现停止状态。
请参阅http://developer.android.com/about/versions/android-3.1.html#launchcontrols
答案 1 :(得分:7)
正如Android Addict在对David Wasser的回答中所说的那样......有一种解决这种行为的方法。
只需将以下标志添加到调用Intent即可。这将确保您也可以从“已停止”的应用程序到达广播接收器。
http://developer.android.com/reference/android/content/Intent.html#FLAG_INCLUDE_STOPPED_PACKAGES
您可以在此处详细了解此Android 3.1更改
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
在这里