广播接收器没有接收意图

Roy*_*ley 4 android broadcastreceiver android-intent

我有两个我完全可以控制的应用程序.两者都使用相同的证书进行签名,并且都使用完全相同的intent过滤器.一个从片段发送广播,另一个假设接收它并做一些事情.然而,这不起作用:

Strings.FILTER_INIT_REGISTER = "com.app.FILTER_INIT_REGISTER"

Intent intent = new Intent(Strings.FILTER_INIT_REGISTER);
getActivity().sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

我已在包含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>
Run Code Online (Sandbox Code Playgroud)

好奇为什么ReportingReceiver类没有得到intent调用?

Dav*_*ser 14

如果您的应用程序只有服务和接收器,那么这将无法在Android 3.1及更高版本中使用.原因是系统不会向处于STOPPED状态的应用程序发送广播Intents .首次安装时,应用程序处于STOPPED STATE状态.当用户第一次手动启动应用程序时,它将从STOPPED STATE中删除.如果用户强制应用程序停止使用应用程序管理器工具,则返回到STOPPED STATE.

由于您的应用程序没有活动,因此用户无法"启动"它.因此它永远不会出现停止状态.

请参阅http://developer.android.com/about/versions/android-3.1.html#launchcontrols

  • 将此添加到intent:intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 谢谢你指点我正确的方向! (8认同)

for*_*emo 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

和这里

http://code.google.com/p/android/issues/detail?id=18225