10

假设有一个在 AccountManager 中创建帐户的应用程序。用户浏览了这个应用程序相当复杂的活动图一段时间,然后进入Accounts and SyncAndroid 设置,删除帐户并登录(仍然Accounts and Sync以其他用户身份登录。

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

那么,问题来了:这些孤儿活动应该怎么办?

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

那么,响应所描述场景的最佳方式是什么?

4

2 回答 2

5

让您的所有活动都从MyActivity具有成员的类扩展BroadcastReceiver:mChangeReceiver。

将mChangeReceiverMyActivity注册到onCreate(并取消注册onDestroy)到LOGIN_ACCOUNTS_CHANGED意图。

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

而已。现在,每当帐户更改时,您所有的活动都会onAccountChanged调用它们的方法并刷新它们的 GUI。

于 2012-04-24T13:01:09.030 回答
0

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

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

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

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

于 2012-04-28T21:42:33.223 回答