gpt4 book ai didi

Android Activity 未从本地服务广播

转载 作者:搜寻专家 更新时间:2023-11-01 09:11:20 26 4
gpt4 key购买 nike

从示例来看,这看起来很简单。也许你可以告诉我我做错了什么。我无法获得接收本地服务发送的广播的 Activity 。

我有启动 Service1 的 Activity1:

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);

当时在前台的 Activity2 使用自己的广播接收器监听 ACTION_DOWNLOAD_FINISHED Intent :

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());

Activity2 当然是注册接收者:

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 似乎从未接收到它。我做错什么了?在处理另一个 Intent 的过程中广播一个 Intent 是否有问题? (我不这么认为——这是异步的,对吧?)

更新:为了确保在接收广播的过程中发送广播没有问题,我更改了我的广播代码以在三秒后在主线程上实际执行广播:

    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

但 Activity 中没有收到任何东西。请帮忙。

最佳答案

Eureka !我找到了!问题是我在我的广播 Intent 中提供了一个数据 URI。 Android Intent 匹配规则有点复杂。如果您提供数据 URI,则您的 Intent 过滤器必须指定匹配的 MIME 类型。

不幸的是,尽管 Android 文档说数据类型可以从数据 URI 中推断出来,显然 Android 并不知道 file://.../example.jpg 是一个图片。所以这是行不通的:

intentFilter.addDataType("image/*");

但是,我可以指定我接受的方案,而不是指定类型:

intentFilter.addDataScheme("file");

行得通!将我的广播限制为 file: URI 有点粗糙——而且有点人为,但由于我目前只使用它,所以它有效。

请注意,显然我可以在广播时在 Intent 中手动指定 MIME 类型,但现在这太麻烦了,因为我正在从 Picasa 下载图像,所以我已经知道它们是图像(并且不知道关心特定的 MIME 类型)。如果它变得太麻烦,我可以完全放弃整个 setData() 并设置一个额外的 --- 但当然我想以正确的方式做事。

关于Android Activity 未从本地服务广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com