Android全应用程序状态管理

Android全应用程序状态管理,android,design-patterns,Android,Design Patterns,我正在为大多数主要的移动操作系统(如iOS、Windows Phone和Android)开发应用程序。我有一个客户端的请求,可以在iOS和WP中实现,但在Android中听起来非常棘手 在iOS和WP中,应用程序生命周期通过对象(如UIApplication和application)接收的事件进行控制 例如,在iOS中,应用程序标识符背景:,应用程序将进入前台:,应用程序将终止:等,明确定义应用程序状态,如非活动,活动和背景,使应用程序状态管理逻辑真正直截了当 在WP中,应用程序接收诸如启动、停

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

在iOS和WP中,应用程序生命周期通过对象(如
UIApplication
application
)接收的事件进行控制

例如,在iOS中,
应用程序标识符背景:
应用程序将进入前台:
应用程序将终止:
等,明确定义应用程序状态,如非活动活动背景,使应用程序状态管理逻辑真正直截了当

在WP中,
应用程序
接收诸如启动停用激活、和关闭等理解良好的事件,这使得在每个应用程序状态下以逻辑方式决定应执行哪些操作以保存为恢复应用程序范围的对象模型变得非常简单

但在Android中,应用程序状态管理听起来非常困难,因为活动的状态发生了变化,例如
onCreate
onRestart
onDestroy
方法重写。当用户会话过期时,我想控制整个应用程序的状态,我想将用户重定向到登录活动并关闭其他打开的活动


关于在活动的
onCreate()
中调用
finish()
,Android会忽略
onRestart()
onResume()
(根据文档)

即使我覆盖了android.app.Application,并将逻辑放在那里,听起来控制打开的活动是不可能的

我几乎尝试了所有可能的活动启动模式组合(例如
SingleTask
SingleInstance
),尽管我无法产生类似iOS和WP中存在的行为

还有一个与这个问题有关的问题可能会更清楚地说明我的问题

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

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


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

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

使用应用程序,您可以得到onCreate,并且可以在这里放置一些逻辑。 所以,是的,这并不像iOS那样直截了当,但它是可行的

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


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

“关于Android忽略在活动的onCreate()、onRestart()或onResume()中调用finish()的事实(根据文档)。”--我不知道你在哪里读到的,当然不是这样。对不起。事实就是这样。参考,如果您仔细关注活动生命周期,那么在onCreate()、onRestart()、onStart()等方法中,活动是不可终止的。。。。请看那边的桌子。当然,尽管它说不可能在onCreate()中杀死一个活动,但它却可耻地杀死了。@anonim.developer:我认为您在该上下文中误解了“killable”的含义。按照表格后面的段落来看,我相信它只是指“不可被系统杀死”,而不是“不可被应用程序开发人员通过finish()杀死”。这意味着您可以依靠这些“不可修改”的方法来完整地执行代码。谢谢!如果用户只是点击重定向登录页面,我应该如何处理当前打开的活动?很抱歉答案并不像你想象的那么简单。如果你打算将该活动留在堆栈中,那么它的Resume()方法将被再次调用,用户将被重定向回登录页面。如果您希望应用程序在它们回击时退出,那么您需要在重定向之前从堆栈中删除该活动。这是你的工作流程,不是我的,我无法知道你想要的“后退”、“回家”等结果会是什么。所以你想在“恢复”方法中的每一项活动中都进行检查。听起来像是噩梦。这不是一个好的解决方案。你为什么会这样认为?放在哪里取决于应用程序的具体情况。您可以在应用程序上下文中侦听活动生命周期事件,或者如果您想在一个位置执行此操作,可以为您的活动创建一个抽象基类。正如我对Commonware的答复,无法在特定状态下关闭活动。请参考developer.android.com/reference/android/app/Activity.html上的文档,当我回复您对Commonware的回复时,您误解了这些文档。阅读你所引用表格后面的段落;事实上,您可以从onCreate()等内部调用finish。如果您怀疑此断言,可以很容易地通过尝试进行验证。是吗?这是你的问题,所以你应该问。这里没有理由怀有敌意,尤其是对那些试图帮助的人。答案是肯定的,它确实起作用,但是我想不出从onResume()中调用finish()的正当理由,或者至少我想不出一个设计可以做这样一件无法改进的事情,并且在这个过程中避免调用。