【问题标题】:Whats the main advantage and disadvantage of "do not keep activities" in androidandroid中“不保留活动”的主要优点和缺点是什么
【发布时间】:2014-02-09 05:54:45
【问题描述】:

如果有人可以这样回答,我想问一个问题:Do not keep activities 在开发人员选项中测试 android 移动应用程序期间要检查的选项。

我在我的应用程序中使用它,发现当我在android中打开Do not keep activities时我的应用程序行为不正常并崩溃。

我的问题很少:

1: How much this option will affect mobile applications?

2: What exactly does this do?

这听起来像是一个应用杀手,我注意到在开发者选项中有一个框说不要保留活动- destroy every activity as soon as the user leaves it

这是否会在我的应用程序上产生任何积极或消极的功能?

这是否意味着如果我打开一个应用程序,一旦我离开它,它实际上会关闭该应用程序,而我不会在任务管理器中看到它来手动杀死它?如果是这样,保持较低的 RAM 使用率不是一件好事吗?

在保持Do not keep activities的同时使用它有什么优点和缺点,欢迎分享经验。

【问题讨论】:

    标签: android performance android-activity usability crash-dumps


    【解决方案1】:

    此选项会对移动应用程序产生多大影响?

    如果他们写得好,这个选项不会影响他们。

    这究竟是做什么的?

    如果您启用此选项,则仅使用方法 onSaveInstanceState 保持活动的变量@ 当您转到另一个活动或应用程序进入后台时,将被保存。所有其他变量将立即删除。 关闭此选项时,可能会保留这些变量

    这是否意味着如果我打开一个应用程序,一旦我离开它,它实际上会关闭该应用程序,而我不会在任务管理器中看到它来手动杀死它?

    不,这意味着所有未保留的变量都将被删除。例如,当您按下主页按钮时。

    这是否会在我的应用程序上产生任何积极或消极的功能?

    不,它只有助于正确开发应用程序。它有助于预测意外情况。

    【讨论】:

    • 并非如此。启用此功能后,当 Activity 不再位于前台时,将在 Activity 上调用 finish()。它没有明确地重置/删除任何变量。
    • 我同意大卫·瓦瑟的观点。我在 Nexus 5 上运行 KitKat 4.4.2 并发现启用此设置后,Activity 在后台运行时实际上会点击 onStop() 或 onDestroy(),但是,当返回前台时 onCreate() 不是必须命中和未保存的成员变量仍保持其原始值。我相信这是因为系统实际上并没有销毁活动,即使它可以选择(没有内存短缺迫使系统实际从内存中删除对象)。
    【解决方案2】:

    不保留活动纯粹是一个开发者选项,可以帮助您检查是否

    1. 您已在 Activity 进入后台之前保存了它的状态。

    2处理内存不足的情况适当地(在这种情况下的活性会被破坏)。̶ P>

    编辑:此选项不模拟低内存情况。当设备遇到内存不足时,系统可能会通过调用 Finish() 来请求 Activity 删除,或者它可能会继续执行并完全终止进程,如注释所述。

    启用此选项进行开发仍然很好。您必须正确编码 onSaveInstanceState()onRestoreInstanceState() 方法。通过这样做,即使进程被终止,当用户导航回此活动时,也会使用保存在 onSaveInstanceState(Bundle) 方法中的 savedInstanceState 调用 onCreate()。

    【讨论】:

    • 评论你的第二个项目:不是真的。在真正的低内存条件下,Android 会简单地终止进程。它不会在现有活动上调用finish(),也不会选择性地杀死活动。
    【解决方案3】:

    优势

    开发者可以检查其应用程序的异常行为并修复low memory - framework kills the application的情况

    缺点

    如果用户在不知不觉中启用了此选项,则设备将运行缓慢,并且每个活动都将在其设备上的用户导航中重新创建。这会妨碍用户工作

    xda developer forum 中给出了关于此选项使用的非常好的答案

    【讨论】:

      【解决方案4】:

      作为对上述答案的补充是另一个,第一眼看不到缺点,您可以使用此选项测试仅活动破坏/娱乐问题,但不能由于内存不足或其他系统条件导致应用程序重新创建的整个过程,因为所有独立于活动的内存都存在。

      假设您有一些singleton,您的类依赖于这些。在系统杀死应用程序后,您的单例也将被清除并恢复为初始状态,以防您自己没有实现它的恢复。因此,尽管您的活动视图状态和字段将在 onSaveInstanceStateonRestoreInstanceState 正确实施的情况下恢复,但这并不能保证在恢复后应用程序行为正确,即使在特定屏幕上也是如此。应该考虑

      因此,要全面测试这种情况,您应该手动停止应用程序,但不要将其从任务管理器中删除。最简单的方法 - 在 android studio 中使用停止红色方形按钮。并再次打开应用程序。

      See more

      【讨论】:

        【解决方案5】:

        Android 操作系统具有此属性,可以清除在后台运行的活动如果设备内存不足,仅优先考虑在顶部运行的活动。

        Developer options 中的选项 Do not keep activities 允许开发人员轻松复制相同的场景。

        理想情况下,开发良好的 Android 应用程序应处理 onSaveInstanceStateonRestoreInstanceState 保存和恢复所有活动的局部变量。

        更多细节在官方Android开发者网站here给出。

        【讨论】:

          【解决方案6】:

          “不保留活动”的优点是它在开始杀死应用程序的不同部分时模拟系统内存不足的情况。您的应用程序必须保持这种情况。缺点是这个选项有点严格,只有在无法模拟服务时才会杀死活动

          【讨论】:

          • 并非如此。在真正的低内存条件下,Android 会简单地终止进程。它不会在现有活动上调用finish(),也不会选择性地杀死活动。
          • “不保留活动”不会只调用finish()。它将模拟系统终止,这意味着当您返回活动时,它将调用 onCreate() 和 savedInstance 女巫可以保存一些参数,所有具有 setRetainInstance(true) 的片段都将恢复它们的类成员。现在为什么每个活动 - 您不知道用户可以在哪里留下您的应用程序以进行电话或电子邮件,因此您需要全部检查。
          • 不,它不会“模拟系统杀戮”。要“模拟系统终止”,它必须终止进程,而此设置不这样做。在真正的低内存条件下,Android 不会选择性地杀死活动,它只是杀死进程。有区别,而且区别很大。
          • 我同意它不喜欢系统杀戮,这就是为什么我为它写了缺点,但它确实可以帮助测试。在我看来,这是测试活动或片段恢复过程的好方法。唯一的问题是这不包括服务恢复。
          • 我并不是要暗示这个设置对测试没有用处。但是,您需要了解它的实际作用。 OP 要求澄清它的实际作用。因此,一个不正确的答案对他或任何阅读本文的人来说都没有多大价值。
          猜你喜欢
          • 2010-12-15
          • 2015-12-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 2017-05-10
          • 1970-01-01
          • 2011-03-27
          • 2011-08-31
          相关资源
          最近更新 更多