当前位置: 首页 > 知识库问答 >
问题:

Android破坏活动、杀戮过程

万坚壁
2023-03-14

嗨,我想知道Android是如何管理内存的,我找不到确切的答案。假设我有一个应用程序在当前activity堆栈上有5个活动(4个停止,1个恢复),没有连接服务。我按HOME键,这样我的所有活动都停止了。我启动了一些其他内存消耗应用程序,而整个设备内存开始变低。问题是

…我的申请会发生什么?

  1. 系统是否只能破坏我的一个或部分活动以恢复内存?
  2. 系统会扼杀我的应用程序的整个过程吗?所有活动都会被很好地销毁吗?
  3. 当我回到我的应用程序时,当它被完全杀死时,会发生什么?它是从乞讨开始(就像第一次开始一样)还是尝试将活动恢复到以前的状态/如果是的话--它是仅仅是堆栈顶部的活动还是所有的活动?

更新:

在问这个问题之前,我看过几次activity生命周期,但它没有回答我的问题。我做了一些测试,我有了一些答案。DDMS中的“停止进程”是测试的线索。

我还没有测试问题1的答案,但正如指南所说:

如果一个activity被暂停或停止,系统可以从内存中删除该activity,要么要求它完成,要么干脆终止它的进程。

似乎可以轻轻地(使用onDestroy方法)破坏其中的一个或多个活动,而不杀死进程。在返回它们时,您只需得到(onCreate+bundle)。

问题2回答:

是的。通常情况下,系统会杀死整个进程,这意味着包括活动和静态字段在内的所有数据都被销毁。这做得不好-您不会为任何暂停/停止的活动获得onDestroy或finialize()。这就是为什么saveInstanceState()在onPause方法之前被调用的原因。onPause基本上是最后一个应该保存东西的方法,因为在使用这个方法之后,您就再也看不到onStop或ondestroy了。系统可以扼杀进程,摧毁你的所有对象,不管它们持有什么,不管它们在做什么。

问题3回答:

当你回到一个被杀死的应用程序时会发生什么?

  • 安卓2.2之前的应用程序将从乞丐开始,启动程序为activity。
  • 从2.2开始-系统将恢复以前的应用程序状态。这是什么意思?这意味着将重新创建最后一个可见的activity(onCreate+bundle)。activity·斯塔克会怎样?堆栈是好的,但它上的所有活动都是死的。当您使用back按钮返回到它时,它们中的每一个都将被重新创建(onCreate+bundle)。这还有一件事:

通常,当用户从主屏幕重新选择任务时,系统会在某些情况下清除任务(从根activity上方的堆栈中删除所有活动)。通常,如果用户在一定时间内(如30分钟)没有访问任务,则会执行此操作。

结论?

  1. 不要以为处理activity轮换问题可以通过Android:configchanges=“orientation”来解决。当你这样做的时候,你会遇到很多你甚至没有意识到的其他问题。
  2. 使用DDMS-Stop process按钮测试应用程序。查看此
  3. 使用静态变量时要小心。不要以为当你在《activity 1》中初始化它们的时候--你会在《activity 2》中初始化它们。初始化全局静态的唯一安全位置是Application类。
  4. 记住,您可能永远不会看到onStop或ondestroy。关闭文件/数据库,在onpause中停止下载程序。当您希望应用程序在BG中执行某些操作时-使用前台服务。

就这样吧...希望我帮了我的essey:)

共有1个答案

罗翔
2023-03-14

首先请看一下这个:

onPause()在系统即将开始恢复以前的activity时调用。这通常用于将未保存的更改提交到持久数据、停止动画和其他可能消耗CPU的东西等。此方法的实现必须非常快,因为在此方法返回之前不会恢复下一个activity。然后是onResume()(如果activity返回到前面),或者onStop()(如果它对用户不可见)。

当activity对用户不再可见时调用onStop(),因为另一个activity已经恢复并覆盖了这个。这可能会发生,要么是因为一个新的activity正在启动,要么是一个现有的被带到这一个前面,要么这一个正在被摧毁。如果这个activity要回来与用户交互,则后面是onRestart();如果这个activity要消失,则后面是onDestroy()。

因此,当您按下设备上的“Home”按钮时,您当前的前景activity将被放在onpause()上,然后onstop()上,其他4个应该保持onstop()

根据谷歌的文件:

  • 如果屏幕前景(堆栈顶部)中有activity,则它处于活动状态或正在运行。
  • 如果activity失去焦点但仍然可见(也就是说,一个新的非全尺寸或透明的activity在您的activity顶部有焦点),则暂停。暂停的activity是完全活动的(它维护所有的状态和成员信息,并保持附加到窗口管理器),但在内存极低的情况下可能被系统杀死。
  • 如果一个activity被另一个activity完全遮蔽,则停止。它仍然保留所有状态和成员信息,但是,它对用户不再可见,因此它的窗口是隐藏的,并且当其他地方需要内存时,它经常会被系统杀死。
  • 如果暂停或停止了一个activity,系统可以从内存中删除该activity,方法是要求它完成,或者简单地终止它的进程。当它再次显示给用户时,必须完全重新启动并恢复到以前的状态。

并且,对于流程生命周期

流程生命周期3。一个后台activity(一个对用户不可见且已暂停的activity)不再是关键的,因此系统可以安全地杀死它的进程,以为其他前台或可见进程回收内存。如果它的进程需要被杀死,当用户导航回activity时(使其再次在屏幕上可见),它的onCreate(Bundle)方法将被调用,并使用它先前在onSaveInstanceState(Bundle)中提供的savedInstanceState以便它能够以用户上次离开它的相同状态重新启动自己。

以上引用均来自:Android开发者参考:activity

确认系统可以破坏非acitve活动,并在你启动一些消耗内存的应用程序时回收内存。您可以在activity中实现类似于:isinstining(),然后使用DDMS中的“kill”按钮检测系统丢弃了哪些活动。但我猜系统会先毁掉最老的一个。然而,当“发射activity”被回收后,保留其他活动就没有意义了。

更新

以下是我从这里找到的一些观点:

停止状态

当一个activity不可见,但仍在内存中时,我们说它处于停止状态。停下来的activity有可能被重新拉回前线,重新变成一个奔跑的activity。或者,它可以被销毁并从记忆中删除。

系统将周围的活动保持在停止状态,因为用户很可能仍希望在不久的某个时间内返回这些活动,并且重新启动停止的activity远比从头开始一个activity要便宜得多。这是因为我们已经在内存中加载了所有的对象,只需要将它们全部放到前台。

停止的活动可以在任何时候从内存中删除。

 类似资料:
  • 正如你们可能知道的,Android支持嵌套片段,也通过API级别为17的支持库。基本上,我正在尝试将嵌套片段添加到ViewPager的片段中,并熟悉这个新的不错的特性。 在第一次应用程序发布时,一切都按预期进行,即我可以添加子片段、浏览这些片段、处理后堆栈等。。 但问题是,当我通过单击后退按钮离开应用程序并重新启动应用程序时,我大多数情况下都会出现以下异常,并不总是: 整个项目都可以在这里找到。

  • 游戏活动中: 这也适用于:

  • 我目前正在开发的一个新应用程序遇到了一个奇怪的问题,如果我将应用程序发送到后台(Home按钮),然后使用应用程序图标重新启动应用程序,除了根活动之外的所有活动都会被销毁(在日志中,我会获得所有活动的OnDestroy,除了调用OnResume的根活动)。 如果我将其发送到后台并从当前任务中恢复,它将恢复应用程序。 我已经将< code > Android:launch mode = " singl

  • 我有一个有三个活动的应用程序。第一活动,第二活动,第三活动。 在第一个活动中有一个按钮,它启动第二个活动。在第二个活动中,有两种方法可以转到第三个活动。但是有一个方法有代码: 两个变体都使用此代码片段。 此代码在-12秒内自动运行 我的问题是:当用户按下Back键时,ThirdActivity会打开,但几秒钟后,ThirdActivity会从第一个变体再次打开。 那么,如何完全终止一个活动,使其在

  • 我使用startActivity(Intent)在我的Android应用程序中创建一个新活动。 有可能扼杀其中一项活动吗?如果有,如何扼杀? 我想要这样 Activity4->Activity1->关闭应用程序

  • 我正在尝试构建一个使用条形码阅读器的android应用程序。 null 以上所有操作都按预期工作,但在onActivityResult事件处理之后,应用程序终止。 在日志文件中,我只能找到一个通用的app-kill消息 您可以在下面找到代码片段并注销。 马蒂亚