如何使用意图来更新活动?

Posted

技术标签:

【中文标题】如何使用意图来更新活动?【英文标题】:How to use an intent to update an activity? 【发布时间】:2010-11-22 09:32:54 【问题描述】:

我有一个正在下载文件的服务。下载完成后,我想更新我的Activity 中的“已下载文件”列表,但前提是Activity 正在运行。如果Activity 尚未运行,我不希望它启动。

我希望我可以通过创建一个带有一些特殊标志的新 Intent 来做到这一点。

有人知道我如何实现这一目标吗?也许是一个小代码示例?

【问题讨论】:

【参考方案1】:

您可以创建新的 BroadcastReceiver 实例并在 Activity 的 onResume() 方法上按照以下方式执行操作:

registerReceiver(myReceiver, new IntentFilter(DownloadService.ACTION_FILE_DOWNLOADED));

之后,重写 myReceiver 的 onReceive() 方法,调用一个函数来更新你想要的组件:

@Override 
public void onReceive(Context context, Intent intent) 
...
    updateViewWithData(service.getNewFileData());
...

在 Activity 的 onPause() 方法上,只需取消注册接收器:

unregisterReceiver(myReceiver);

希望对你有帮助,有不清楚的地方欢迎追问。

【讨论】:

这是非常好的沟通方式。但是,当活动处于暂停状态时,如果结果已交付,该怎么办?所以在onResume 活动之后可以等待很长时间才能得到结果。并且不会收到任何数据,因为数据丢失了。【参考方案2】:

执行此操作的好方法是将“已下载文件”活动绑定到服务。绑定服务时,在 onServiceConnected 函数中,注册一个 Binder 回调。然后,只要您有新数据可用,服务就会调用该回调。如果activity没有运行,服务端的回调列表为空,不会通知你的activity。

有关此方法的示例,请查看 android SDK 中的 RemoteService.java:

samples\ApiDemos\src\com\example\android\apis\app\

【讨论】:

与 Dimitar Dimitrov 提出的意图消息传递相比,这样做有什么优势?谢谢

以上是关于如何使用意图来更新活动?的主要内容,如果未能解决你的问题,请参考以下文章

Google Play 服务:如何检查当前是不是有注册到位置更新/活动识别的“活动”挂起意图回调?

如何从我的活动中意图在我的标签栏中分段?

如何在创建后通过更改活动来处理推送通知意图?

如何从后台服务android更新谷歌地图v2位置

如何从服务中获取更新信息?

如何从活动意图到特定片段