【问题标题】:updating an activity from an asynchronous service从异步服务更新活动
【发布时间】:2010-04-02 17:39:53
【问题描述】:

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

【问题讨论】:

    标签: android asynchronous service android-activity


    【解决方案1】:

    在您的服务中,只需致电startActivity(new Intent(this, TopLevelActivity.class))。如果 TopLevelActivity 尚未运行,这将启动您的 TopLevelActivity,或者如果您的 TopLevelActivity 已经在运行,则调用它的 onNewIntent() 方法,并将其置于顶部。如果您想收到通知,您可以覆盖 onNewIntent() 并捕获 Intent。

    【讨论】:

    • 请记住,用户不一定喜欢在他们正在做的事情中突然出现的活动(例如,玩游戏、输入短信、使用电话中的拨号盘)打电话)。
    • 感谢同步。这行得通!但是我确实必须在我的活动类中添加一个静态标志,告诉我它们当前是否处于活动状态。我在暂停和恢复中翻转这个标志。这样我就不会改变手机的状态。如果活动打开,我只会更新 UI。我确实覆盖了 onNewIntent() ,在那里我检查了一个布尔值,该布尔值添加到我的服务发送的意图中。这样,如果意图来自我的服务,我会更新 ui。由于布尔值,我对这种方法不是很满意,但它起作用了。再次感谢。
    • 或者,您可以使用添加到服务中的一些自定义方法在onResume() 中向服务注册活动;类似于mService.registerActivity(this)onPause() 中的mService.unregisterActivity(this),这样服务就知道活动当前是否处于活动状态。
    【解决方案2】:

    您应该从服务中广播 Intent,然后让 Activity 成为广播接收器。

    这是一篇关于BroadcastReceiver 的文章。

    希望这会有所帮助。

    【讨论】:

    • 我读到广播不应该在您的应用程序内部进行通信时进行,因为会产生开销。我认为 Ben Tobin 的解决方案可能是最好的答案。
    【解决方案3】:

    我相信正确的方法是使用使用 AIDL 的远程接口: https://developer.android.com/guide/components/aidl.html

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

    【讨论】:

    • 谢谢本。我会调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多