Android 从异步服务更新活动

Android 从异步服务更新活动,android,asynchronous,service,android-activity,Android,Asynchronous,Service,Android Activity,我已经实现了一个在我的应用程序和谷歌文档之间进行异步同步的服务。我想在同步完成后更新应用程序的顶级活动。但是,由于该服务的原因,该应用程序可能处于未知状态。有没有一种方法可以让顶级活动(不管是什么)从服务中的异步任务重新创建自己。在您的服务中,只需调用startActivity(newintent(this,TopLevelActivity.class))。如果TopLevelActivity尚未运行,则会启动它;如果TopLevelActivity已运行,则会调用它的onNewIntent()

我已经实现了一个在我的应用程序和谷歌文档之间进行异步同步的服务。我想在同步完成后更新应用程序的顶级活动。但是,由于该服务的原因,该应用程序可能处于未知状态。有没有一种方法可以让顶级活动(不管是什么)从服务中的异步任务重新创建自己。

在您的服务中,只需调用
startActivity(newintent(this,TopLevelActivity.class))
。如果TopLevelActivity尚未运行,则会启动它;如果TopLevelActivity已运行,则会调用它的
onNewIntent()
方法,并将其置于顶部。如果您希望得到通知,您可以覆盖onNewIntent()并捕获意图。

我认为,正确的方法是使用AIDL使用远程接口:


您可以创建一个简单的
*.aidl
文件,其中包含接口,Android工具将为您生成接口类。它将允许您注册回调方法。比来回抛出startActivity意图要干净得多。

您应该从服务中广播意图,然后让活动成为广播接收器

这是一篇关于他的评论


希望这有助于。

记住,用户不一定欣赏在他们正在做的事情中间突然出现的一种活动(例如,玩游戏、打短信、打电话时使用拨号盘)。谢谢Syic。这管用!然而,我必须在我的活动类中添加一个静态标志,告诉我它们当前是否处于活动状态。我在暂停和恢复时翻转此标志。这样我就不会改变手机的状态。如果活动处于打开状态,我只需更新UI。我确实重写了onNewIntent(),在这里我检查了一个布尔值,它被添加到我的服务发送的意图中。这样,如果意图来自我的服务,我会更新ui。我对这种方法不是非常满意,因为它有布尔值,但它能起作用。再次感谢。或者,您可以使用添加到服务中的一些自定义方法,在
onResume()
中向服务注册您的活动;类似于
onPause()
中的
mService.registerActivity(this)
,以及
mService.unregisterActivity(this)
,这样服务就会知道活动当前是否处于活动状态。谢谢Ben。我将对此进行研究。我了解到,由于开销,在应用程序内部通信时不应进行广播。我认为本·托宾的解决方案可能是最好的答案。