为什么在使用应用程序时可以使用Bundle?

时间:2011-10-20 01:50:15

标签: android-activity android

我正在阅读这篇关于如何:correctly retain variable state in Android的文章,我提醒我,我从来没有得到一个好答案(并且在这里找不到一个)为什么最好与Bundle争吵(这不是一个巨大的麻烦,但肯定有它的局限性)而不是总是在你的应用程序中覆盖应用程序,只是将所有持久数据成员存储在那里。是否存在泄漏风险?有没有办法可以意外释放内存?我只是不清楚这一点...它看起来像是一个完全可靠的“阁楼”所有的活动,并且是存储任何你担心可能会重置用户转动设备或暂停时的重要场所该应用程序。

我错了吗?希望能够清楚地了解内存在应用程序中的真实生命周期。


根据以下答案,让我提出我的问题。

假设我有一个基于它在启动时加载的XML文件的行为不同的应用程序。

具体来说,该应用程序是一个用户信息收集应用程序,根据XML设置,它将遵循开放式的各种路径(收集信息A,但不是J,并提供Survey P,然后是可选的PhotoTaking机会等)

理想情况下,我不必将此行为路径的详细信息存储在Bundle(上帝禁止)或数据库中(也很丑陋,但不那么)。我会加载XML,处理它,并让Application保持在该结构上,所以我可以参考它下一步做什么以及如何做。如果应用程序暂停并且应用程序被释放,那么在我的CustomFlow对象(根据XML生成)中检查null并且重新实例化它并不是很麻烦。无论如何,这听起来并不常见。这是一个很好的例子,说明应用程序是最好的工具吗?

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:3)

我更喜欢将Application子类化并指向我的清单。我认为这是编码Android的理智方式,尽管谷歌的Android架构师认为你应该使用Singletons(eek)来做到这一点。单身人士与应用程序具有相同的生命周期,因此适用于他们的所有内容都适用于应用程序,除了单身人士创建的依赖性混乱。基本上他们甚至不使用捆绑。我认为使用子类Application可以大大提高Android中的编程速度,而且麻烦要少得多。

现在是下行。如果手机需要更多内存或您的应用程序进入后台,您的应用程序可能会关闭。这可能意味着用户接听电话或检查了他们的电子邮件。例如,假设您有一个Activity强制用户登录以获取其他Activities将用于进行服务器调用的令牌。这可能是您存储在Application子类中的服务对象(不是android服务只是一个向您的服务器发送网络调用的类)中存储的内容。好吧,如果您的应用程序被关闭,您将丢失该令牌,当用户单击后退按钮时,您的用户可能会返回一个活动,该活动假定您已经过身份验证并且您的服务类无法正常工作。

那你能做什么?继续使用Bundle awfulness?好吧,没有你可以轻松地将安全令牌存储到捆绑包中(尽管可能存在一些安全问题,具体取决于它对您的应用程序的工作方式),或者您必须编写您的活动代码以不假设应用程序所处的特定状态.I必须检查令牌丢失并在发生这种情况时将用户重定向回登录屏幕。但是,根据Application对象保存的状态,这可能很棘手。但请记住,您的应用程序可以知道它何时被关闭并将其内部状态持久保存到捆绑包中。 这至少允许你在你的应用程序的99%的时间内将你的对象保留在内存中,并且只有在你关闭时才保存/恢复,而不是每当你在各个活动之间移动时不断地使用样板代码进行序列化和反序列化。使用应用程序可以集中化程序的启动和关闭方式,并且由于它通常比任何一个活动都要长,因此当用户在“活动”之间移动时,它可以减少程序重新构建应用程序内容的需要。这样可以通过从每个Activity中保留应用程序的详细信息来使代码更清晰,如果已经构建了应用程序,则可以减少开销,共享公共实例/代码,并允许回收活动而不会丢失所有程序。所有优秀的程序都需要一个核心的集中式中心,而子类化应用程序为您提供了允许您参与Android生命周期的功能。

我个人最喜欢的是使用http://flexjson.sourceforge.net/将我的Java对象序列化为JSON,如果我需要发送对象或保存它们。当你需要做的只是持久化数据时,比写入sqlite DB容易得多。使用对象而不是分开的原语在两个活动之间发送数据时很好。

请记住,通过在应用程序中集中模型,您可以创建一个在多个活动之间共享代码的位置,这样您始终可以通过挂钩onPause()以及允许将持久性集中在一起来将活动持久性委托给Application中的对象。

答案 2 :(得分:2)

简短的回答是:使用捆绑包,因为它可以在您更容易背景时保存状态。而且,它很复杂。

答案很长:

我的理解是,一旦调用了Activity的onPause方法(以及onSaveInstanceState,它为您提供了一个应该存储Activity活动数据的包),您的流程可以在没有进一步警告的情况下终止。之后,当用户返回到您的应用程序时,您的活动将与该原始包一起进行onCreate调用,从中恢复其状态。这将发生在原始堆栈的所有活动中。

能够从捆绑中恢复您的状态(Android会在您的过程消失时为您保存)是Android维护多任务神话的方式。如果每次调用onSaveInstanceState时都没有将活动的状态转储到一个包中,那么当用户刚刚关闭一秒时,您的应用程序看起来就像重新启动了一样。当系统受资源限制时,这可能会特别麻烦,因为系统需要更频繁地终止进程以保持设备快速运行

为什么应用程序可能不好

如果进程关闭,应用程序实际上没有机会保存其任何数据。它确实有一个onDestroy方法,但是文档会告诉你实际上系统永远不会在实际设备上调用它。这意味着,在我上面提到的受约束的情况下,如果流程结束,任何有关活动中发生的事件的事件(如果您已将其保存在应用程序中)都将丢失。

开发人员经常会错过这种情况(这对用户来说真的很烦人),因为他们要么在开机手机上运行,​​而这款手机不会同时使用多个应用程序。我们也暂时没有使用该应用程序,然后切换到另一个应用程序,并在一段时间后再次切换回来。