从这些例子来看,这看起来很简单。也许你可以告诉我我做错了什么。我无法接收从本地服务发送的广播的活动。
我有Activity1启动Service1:
startService(new Intent(Activity1.this, Service1.class));
Activity1然后启动Activity2:
startActivity(new Intent(Activity1.this, Activity2.class));
Service1,一个本地服务,监听下载:
protected final BroadcastReceiver service2DownloadBroadcastReceiver = new BroadcastReceiver()
{
public void onReceive(final Context context, final Intent intent)
{
...
broadcastDownloadFinished(Uri.fromFile(downloadedFile));
Service1的广播接收器然后广播自己的消息:
protected Intent broadcastDownloadFinished(final Uri uri)
{
final Intent intent = new Intent(ACTION_DOWNLOAD_FINISHED).setData(checkNotNull(uri));
sendBroadcast(intent);
活动2,当时在前台,使用自己的广播接收器监听ACTION_DOWNLOAD_FINISHED意图:
private final BroadcastReceiver activity2DownloadBroadcastReceiver = new BroadcastReceiver()
{
public void onReceive(final Context context, final Intent intent)
{
Log.i(Activity2.class.getSimpleName(), "Received download event: " + intent.getAction() + " " + intent.getData());
活动2当然会注册接收者:
protected void onResume()
{
super.onResume();
final IntentFilter downloadIntentFilter = new IntentFilter();
downloadIntentFilter.addAction(ACTION_DOWNLOAD_FINISHED);
registerReceiver(activity2DownloadBroadcastReceiver, downloadIntentFilter);
如果重要,ACTION_DOWNLOAD_FINISHED
就像"com.example.intent.action.DOWNLOAD_FINISHED"
。
Service1在其接收器中接收下载管理器事件,并显然广播自己的自定义事件,但Activity2似乎从未接收过它。我做错了什么?在处理另一个意图的过程中广播意图是一个问题吗? (我不这么认为 - 这是异步的,对吗?)
更新:为了确保在接收广播的过程中发送广播没有问题,我改变了我的广播代码,以便在主线程上三秒后实际执行广播:< / p>
Log.i(getClass().getSimpleName(), "...ready to broadcast");
final Intent intent = new Intent(ACTION_DOWNLOAD_FINISHED).setData(checkNotNull(uri));
mainThreadHandler.postDelayed(new Runnable()
{
public void run()
{
Log.i(getClass().getSimpleName(), "...broadcasting");
sendBroadcast(intent);
Log.i(getClass().getSimpleName(), "...broadcasted");
}
}, 3000);
Log.i(getClass().getSimpleName(), "...scheduled to broadcast");
正如预期的那样,日志说:
...ready to broadcast
...scheduled to broadcast
...broadcasting
...broadcasted
但活动中没有收到任何内容。请帮忙。
答案 0 :(得分:3)
尤里卡!我找到了!问题是我在广播意图中提供了一个数据URI。 Android意图匹配规则有点复杂。如果提供数据URI,那么您的intent过滤器必须指定匹配的MIME类型。
不幸的是,尽管Android文档说数据类型可以从数据URI中推断出来,但显然Android并不知道file://.../example.jpg
是图像。所以这不起作用:
intentFilter.addDataType("image/*");
但是,我可以指定一个我接受的方案,而不是指定类型:
intentFilter.addDataScheme("file");
有效!这有点粗糙 - 并且有点人为地将我的广播限制为file:
URI,但正如我现在所使用的那样,它有效。
请注意,显然我可以在广播时手动指定意图中的MIME类型,但现在这太麻烦了,因为我从Picasa下载图像所以我已经知道它们是图像(并且不是关心特定的MIME类型)。如果它变得太麻烦,我可以放弃整个setData()
的事情并设置一个额外的 - 但当然我想以正确的方式做事。
答案 1 :(得分:0)
您是否已将接收器包含在活动的清单中?
<receiver
android:name=".YourReceiver">
<intent-filter>
<action
android:name="intent_name"></action>
</intent-filter>
</receiver>