Android应用程序应如何响应环境中的关键变化?

时间:2012-04-20 13:13:56

标签: android

假设有一个应用程序在AccountManager中创建一个帐户。用户暂时浏览此应用程序的相当复杂的活动图表,然后转到Android设置中的Accounts and Sync,删除帐户并登录(仍以Accounts and Sync作为其他用户。

我为LOGIN_ACCOUNTS_CHANGED广播定义了一个接收器,我可以优雅地关闭所有服务。但是活动仍然存在,在标题中带有第一个用户的名字(UI在很多方面搞砸了,但这个是最明显的)。

所以,问题是:应该对这些孤儿活动做些什么?

  • 我可以使用类似clearTaskOnLaunch的内容,但是当更改发生时,所有活动都在后台。
  • 在SharedPreferences中设置一个标记并检查每个活动的onResume(),然后根据需要启动clearTask活动?太乱了。
  • 我能想出的最佳选择是使用android.os.Process.killProcess(android.os.Process.myPid())来杀死所有活动。这不是太优雅,但可以完成工作。唯一的副作用是活动堆栈仍然存在,最合理的事情似乎是从LAUNCHER活动开始,具有明确的历史。

那么,回应所述情景的最佳方式是什么?

2 个答案:

答案 0 :(得分:5)

让您的所有活动都来自MyActivityBroadcastReceiver成员:mChangeReceiver。

MyActivityonCreate中注册mChangeReceiver(并在onDestroy中取消注册),注册LOGIN_ACCOUNTS_CHANGED意图。

让mChangeReceiver调用一些抽象方法onAccountChanged(),所有扩展类都需要覆盖和实现以反映GUI中的更改。

就是这样。 现在,只要帐户发生变化,您的所有生活活动都会调用onAccountChanged方法并刷新其GUI。

答案 1 :(得分:0)

我有一些想法,基于你有用户登录机制的事实:

关于UI,如何在onPause上更新用户名UI(可能是textview)到“”并在onResume上将其更新为当前用户?

如果需要关闭活动,您可以将当前用户保存到全局变量和每个活动。每个活动应检查全局活动是否与他们上次更新时存储的活动相同。如果它们不同,您可以关闭活动。您也可以使用clearTask标志。

处理活动的另一种方法是使用片段堆栈。有关更多信息,请查看片段堆栈的android支持示例。