2010-04-02 51 views
2

我已经实现了一个在我的应用程序和Google文档之间执行异步同步的服务。我想在同步完成后更新我的应用程序的顶级活动。但是,由于该服务,应用可能处于未知状态。有没有办法让顶级活动成为可能,从服务中的asynchtask重新创建自己。从异步服务更新活动

回答

2

在您的服务中,只需致电startActivity(new Intent(this, TopLevelActivity.class))。如果它尚未运行,它将启动您的TopLevelActivity,或者在您的TopLevelActivity的方法正在运行时调用您的TopLevelActivity方法,并将其带到最前面。如果您想收到通知,您可以覆盖onNewIntent()并捕获意图。

+2

请记住,用户不一定会欣赏在他们正在做的事情(例如,玩游戏,键入文字消息,在拨打电话时使用拨号盘)突然冒出来的活动。 – CommonsWare 2010-04-02 18:53:38

+1

谢谢合作。这工作!但是我确实需要为我的活动类添加一个静态标志,告诉我他们是否当前处于活动状态。我暂停翻转此标志并继续。这样我就不会改变手机的状态。如果活动已打开,我只需更新UI。我没有覆盖onNewIntent(),我检查了一个布尔值,它被添加到我的服务发送的意图中。这样,如果意图来自我的服务,我更新了用户界面。由于布尔运算符的原因,我不太喜欢这种方法,但它的功能。再次感谢。 – 2010-04-02 18:55:33

+2

或者,您可以在'onResume()'中使用您添加到服务中的一些自定义方法将您的活动注册到服务中。像'mService.registerActivity(this)'和'onService()'中的'mService.unregisterActivity(this)',这样服务就知道Activity是否当前处于活动状态。 – synic 2010-04-02 19:09:38

2

正确的方式做到这一点,我相信,是使用使用远程接口AIDL: https://developer.android.com/guide/components/aidl.html

您做一个简单的*.aidl文件与它的接口,和Android工具将生成接口类为你。它将允许您注册回调方法。比折腾startActivity意图来得更干净。

+1

谢谢本。我会研究这个。 – 2010-04-02 20:58:51

2

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

这是一个写在BroadcastReceiver

希望这会有所帮助。

+1

我读过广播不应该在你的应用程序内部进行通信时因为开销。我认为本托宾的解决方案可能是最好的答案。 – 2010-04-03 04:20:29