Android如何在内存不足时释放内存,以及如何重新启动它们?

Android如何在内存不足时释放内存,以及如何重新启动它们?,android,android-lifecycle,Android,Android Lifecycle,请注意以下词汇以避免混淆 1当我说重新实例化一个活动时,我指的是activity.onCreatebundle 2当我说从头开始一项活动时,我指的是activity.onCreatenull 虽然我不确定这对本文的目的有什么影响,但请假设我感兴趣的Android应用程序都在同一个任务中启动了它们的活动 Android如何从应用程序中释放内存? 假设我有一部电话。我正在同时使用许多应用程序。我对当前的Snapchat应用程序感到厌烦。所以我按下主页按钮,打开Facebook。请注意,我没有按“上一

请注意以下词汇以避免混淆

1当我说重新实例化一个活动时,我指的是activity.onCreatebundle

2当我说从头开始一项活动时,我指的是activity.onCreatenull

虽然我不确定这对本文的目的有什么影响,但请假设我感兴趣的Android应用程序都在同一个任务中启动了它们的活动

Android如何从应用程序中释放内存? 假设我有一部电话。我正在同时使用许多应用程序。我对当前的Snapchat应用程序感到厌烦。所以我按下主页按钮,打开Facebook。请注意,我没有按“上一步”按钮,因此Snapchat在最近的应用程序概述中仍然有效

突然,由于某种原因,手机内存非常不足,需要开始强制释放一些后台应用程序

为了释放内存,Android操作系统会停止Snapchat的一些活动吗

Android操作系统是否会为了释放内存而停止Snapchat的所有活动

Android是如何管理被杀掉的应用程序的? 现在让我们假设我想回到Snapchat。我点击overview按钮,从最近使用的应用程序滚动列表中选择Snapchat

Android操作系统会重新启动Snapchat的一些活动吗

Android操作系统会重新启动Snapchat的所有活动吗

Android操作系统将重新启动Snapchat的零活动,并从初始启动程序活动开始


TL;DRD:所有活动都被终止

ActivityManagerService似乎不再杀死任何东西,它只是强制GC调用和分派trim事件

if (false) {
   // For now we won't do this; our memory trimming seems
   // to be good enough at this point that destroying
   // activities causes more harm than good.
   if (curLevel >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE 
            && app != mHomeProcess && app != mPreviousProcess) {
       // Need to do this on its own message because the stack may not
       // be in a consistent state at this point.
       // For these apps we will also finish their activities
       // to help them free memory.
       mStackSupervisor.scheduleDestroyAllActivities(app, "trim");
   }
 }
尽管当它试图杀死某个东西时,它会杀死后台应用程序的整个过程,它会简单地调用kill-9[PID]。由于默认情况下,您的所有活动都在一个PID下运行,所以当一个进程死亡时,它们都会被销毁

OOM和低内存杀手也是如此——它们都是通过进程运行的,不区分您的活动

然而,请注意,有些人声称Android有时会在内存不足的情况下逐个杀死特定的活动。我在AOSP中找不到任何证据

============== 现在,关于恢复你的应用程序。我可能不是这里的专家,因为这是连接到Android的任务和后堆栈系统,这比他们的教程视频看起来要复杂得多

该操作从调用ActivityManagermoveTaskToFront开始。。。它最终将我们带到ActivityManager服务移动任务到FrontLocked

在那里,操作系统将尝试检索与应用程序关联的存储任务记录。如果您的应用程序已被销毁,经理将不得不转到ActivityStackSupervisorRestorRecentTaskLocked。。。如果一切顺利,就要找到任务和后台堆栈,并对任务中的每个活动执行此操作:

final ArrayList<ActivityRecord> activities = task.mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
   final ActivityRecord r = activities.get(activityNdx);
   mWindowManager.addAppToken(0, r.appToken, task.taskId, stack.mStackId,
     r.info.screenOrientation, r.fullscreen,
    (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,
       r.userId, r.info.configChanges, task.voiceSession != null,
      r.mLaunchTaskBehind);
}
所以我的猜测是,当操作系统还原一个应用程序时,它会完全重新创建活动堆栈,但实际上只有最顶层的活动会重新启动。我想,设置一个实验来确定我是否在这里很容易

=======
还有一个更新:是的,这两个方法ActivityStackSupervisorresumeTopActivitiesLocked和ActivityStackSupervisorresumeTopActivityLocked。。。稍后再打电话。虽然我真的不明白他们为什么要在多个堆栈中恢复活动-正如我所说,我绝对不是这里的专家。

感谢您的回复。你觉得我的第二个问题怎么样?对不起,我不太明白你说的完全重新创建活动堆栈是什么意思,但实际上只有最顶层的活动重新启动。你能澄清一下你的意思吗?你说的重新启动到底是什么意思?@AlanSTACK好的,通过向堆栈中添加ActivityRecord实体来重新创建堆栈并重新设置活动堆栈。只有最顶层的活动才真正重新启动,这意味着只有所述堆栈中最顶层的活动真正经历了整个onCreate/onCreateView/onResume/。。。过程有关活动堆栈的更多信息,请访问developer.android.com上的任务和后台堆栈教程
// Here it is!  Now, if this is not yet visible to the
// user, then just add it without starting; it will
// get started when the user navigates back to it.