【问题标题】:Android Whole Application State ManagementAndroid 整体应用状态管理
【发布时间】:2012-08-17 23:15:21
【问题描述】:

我正在为大多数主要移动操作系统(如 iOS、Windows Phone 和 Android)开发应用程序。我有一个来自我的客户的请求,可以在 iOS 和 WP 中实现,但在 Android 中听起来非常棘手。

在 iOS 和 WP 中,应用程序生命周期是通过 UIApplicationApplication 等对象接收的事件来控制的。

在iOS中,例如applicationDidEnterBackground:applicationWillEnterForeground:applicationWillTerminate:等,明确定义InactiveActiveActive等应用状态strong>背景并让应用状态管理逻辑非常直接。

在 WP 中,Application 接收很好理解的事件,例如 LaunchingDeactivatedActivatedClosing > 这使得逻辑上决定在每个应用程序状态下应该做什么以保存为恢复应用程序范围的对象模型变得非常简单。

但在 Android 中,应用程序状态管理听起来很困难,因为活动的状态变化,例如 onCreateonRestartonDestroy 方法覆盖。我的问题出现在我想在用户会话过期时控制整个应用程序状态并且我想将用户重定向到登录活动并关闭其他打开的活动。

关于在活动的onCreate()onRestart()onResume() 中调用finish() 被Android 忽略的事实(根据文档)。

即使我覆盖android.app.Application 并将逻辑放在那里,听起来也无法控制打开的活动。

我几乎尝试了所有可能的活动启动模式组合(例如SingleTaskSingleInstance),尽管我无法产生像 iOS 和 WP 中那样的行为。

还有一个与此问题相关的post 可以更清楚地说明我的问题。

确切的问题是,“是否有可能在 Android 中产生 iOS 或 WP 应用程序行为?”

【问题讨论】:

  • “关于在 Activity 的 onCreate()、onRestart() 或 onResume() 中调用 finish() 被 Android 忽略的事实(根据文档)。” -- 我不知道你在哪里读到的,当然不是这样。
  • 对不起。恕我直言,情况确实如此。参考developer.android.com/reference/android/app/Activity.html,如果你仔细注意activity的生命周期,一个activity在onCreate()、onRestart()、onStart()等方法中是无法杀死的,...请看那里的表格。当然,虽然它说在 onCreate() 中不可能杀死一个活动,但它确实做到了。
  • @anonim.developer:我认为您在这种情况下误解了“可杀死”的含义。通过紧跟在表格后面的段落,我相信它只是意味着“系统无法杀死”,而不是“应用程序的开发人员无法通过 finish() 杀死”。这意味着您可以依靠在那些“无法杀死”的方法中完整执行您的代码。

标签: android design-patterns


【解决方案1】:

所以本质上,一旦“会话”到期,无论用户尝试做什么,您都希望他们被重定向到登录活动,是吗?

假设您有一个可以调用的方法来告诉您会话是否已过期,为什么不简单地在 onResume() 等中检查该方法,如果会话已过期,请将用户重定向到登录活动?

【讨论】:

  • 谢谢!如果用户只是回击重定向的登录页面,我应该如何处理当前打开的活动?对不起!答案并不像你想的那么简单。
  • 好吧,如果您打算将该活动留在堆栈中,那么它将再次调用 Resume() 方法,并且用户将被重定向回登录页面。如果您希望应用程序在他们回击时退出,那么您需要在重定向之前从堆栈中删除该活动。这是你的工作流程,不是我的,我无法知道你想要的按回、回家等的结果会是什么。
  • 因此您希望将该检查放入每个活动的 onResume 方法中。听起来像一场噩梦。这不是一个好的解决方案。
  • 你为什么会这样假设?你把它放在哪里取决于应用程序的细节。您可以在应用程序上下文中监听活动生命周期事件,也可以为活动创建一个抽象基类(如果您想在一个地方进行)。
【解决方案2】:

这里有一个关于您可能感兴趣的应用程序状态的答案:

Checking if an Android application is running in the background

使用 Application,您可以获得 onCreate,您可以在此处放置一些逻辑。 所以,是的,它不像 iOS 那样直接,但它是可行的。

如果它只是一个会话状态,请创建一个基础活动来检查会话状态 并从中继承您的所有活动。

您可以在进入登录页面之前使用 Android SDK 关闭所有活动,或者...锁定返回按钮。

【讨论】:

  • 当我回复 CommonsWare 时,不可能在某些状态下关闭活动。请参阅 developer.android.com/reference/android/app/Activity.html 上的文档,
  • 当我回复您对 CommonsWare 的回复时,您误解了这些文档。阅读您引用的表格后面的段落;实际上,您可以从 onCreate() 等内部调用完成。如果您怀疑这个断言,通过尝试来验证很容易。
  • 有吗?这是你的问题,所以你应该有。没有理由在这里怀有敌意,尤其是对那些试图提供帮助的人。答案是肯定的,它确实有效,但是我想不出一个从 onResume() 中调用 finish() 的正当理由,或者至少我想不出一个设计来做这样的事情无法改进,在此过程中避免调用。