android对应生命周期中应该释放哪些资源

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android对应生命周期中应该释放哪些资源相关的知识,希望对你有一定的参考价值。

onPause():
当系统调用activity中的onPause(),从技术上讲,意味着activity仍然处于部分可见的状态.但更多时候意味着用户正在离开这个activity,并马上会进入Stopped state. 通常应该在onPause()回调方法里面做以下事情:
停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费. 提交在用户离开时期待保存的内容(例如邮件草稿). 释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。

onResume():
当用户从Paused状态恢复activity时,系统会调用onResume()方法。系统每次调用这个方法时,activity都处于前台,包括第一次创建的时候。所以,应该实现onResume()来初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入Resumed state都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)

onStop():
当activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源。一旦activity停止了,系统会在需要内存空间时摧毁它的实例(和栈结构有关,通常back操作会导致前一个activity被销毁)。极端情况下,系统会直接杀死我们的app进程,并不执行activity的onDestroy()回调方法, 因此我们需要使用onStop()来释放资源,从而避免内存泄漏.

onRestart(),onStart():
当activity从Stopped状态回到前台时,它会调用onRestart().系统再调用onStart()方法,onStart()方法会在每次activity可见时都会被调用。onRestart()方法则是只在activity从stopped状态恢复时才会被调用,因此我们可以使用它来执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。
参考技术A 这个线程使用while(true)无限执行输出操作,如下:
new Thread(new Runnable()

@Override
public void run()
// TODO Auto-generated method stub
while (true)

try
Thread.sleep(1000);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();

handler.sendEmptyMessage(1);


).start();
Log.i("",id+"" );
break;

handler代码
Handler handler=new Handler()

@Override
public void handleMessage(Message msg)
// TODO Auto-generated method stub
switch (msg.what)
case 1:
Log.i("",id+"" );
id++;
break;

default:
break;

;

当我调用finish指令之后,查看Logcat,依旧可以看到id仍在输出。
在查看网上的生命周期讲解时,都说在执行onDestroy时会释放掉activity所占用的资源。那么理论山过来说这个handler对象和ID对象也该被释放才对啊,为什么会这样呢。同时,当我试图在hangdler中使用MainActivity.this.isDestroyed()时会报异常,该对象已经被destroy。
个人推测1:destroy之后,这个activity仍旧存在于内存中,只是activity本身的一些方法和属性不可使用,但是在它内部定义的其他对象却能使用。
2:在activity内定义的对象跟activity根本不是存放在一个地方的,不像C#类内部定义的字段,对象之类的,会和该类实例化对象放在一起。本回答被提问者和网友采纳

详解Android Activity生命周期

转载注明来自:   http://www.cnblogs.com/wujiancheng/

一、正常情况下Activity的生命周期:

 Activity的生命周期大概可以归为三部分

整个的生命周期:onCreate()可以设置所有的“全局”状态, onDestory()可以释放所有的资源

可见的生命周期:onStart()显示给用户的UI数据和资源等, onStop()当不再需要显示时候,可以释放资源

前台的生命周期:该生命周期活跃,onResume()回到前台,onPause()不可见状态或被覆盖

不要在onCreate()方法中执行耗时的操作,onStart()及onResume()不可进行过多操作,不然打开桌面应用图标会卡顿。

 

技术分享

 

(1)onCreate:表示Activity正在被创建。可以调用setContentView加载布局资源、初始化各控件、设置监听、并初始化一些全局的变量。因为在Activity的一次生命周期中,onCreate方法只会执行一次。在Paused和Stopped状态下恢复或重启的下,这些控件、监听和全局变量也不会丢失。即便是内存不足,被回收了,再次Recreate的话,又是一次新的生命周期的开始,又会执行onCreate方法。

  (2)onRestart:表示Activity正在重新启动。当处于非栈顶状态的活动需要再次返回栈顶,展现给用户的时候,触发该方法。调用的场景主要有:home键之后,然后切换回来、Activity跳转到另一个Activity之后,按back键返回原来Activity。很少调用,因为它只在onStop之后才可能调用,所以操作放在onStart方法里面就比较好。

  (3)onStart:表示Activity正在启动,这时Activity已经可见,但是还没有出现在前台,还无法和用户交互。

  (4)onResume:表示Activity已经可见了,并且出现在前台并开始活动。

  (5)onPause:表示Activity正在停止,正常情况下,onStop会接着调用,但是打开的是透明的Activity,不会调用onStop,返回会调用onResume。可以执行一些轻量级的释放工作(耗时会影响到新的Activity显示,onPause必须执行完,新Activity的生命周期才会执行)例如:停止动画、取消broadcast receivers等。

  (6)onStop:表示Activity将要停止,极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory方法,所以我们需要在onStop方法中尽可能的释放那些用户暂时不需要使用的资源,防止内存泄露。可以做一些稍微重量级的回收工作,例如:数据保存,需要用到的数据库操作。

  (7)onDestory:表示Activity将被销毁,确定某些资源是否没有被释放,做一些最终的清理工作,比如在这个Activity的onCreate中开启的某个线程,那么就要在onDestory中确定它是否结束了,如果没有,就结束它。

 

几种生命周期流程的情况:

 

 (1)现在有两个Activity,A 和B,都重写了所有的生命周期方法。

 

  进入A,回调:AonCreate-->AonStart-->AonResume。返回桌面:AAonPause-->AonStop。

 

  点击按钮进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume-->AonStop。

 

  按下back键,回调:BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory

 

  (2)启动对话框样式的Activity,有两个Activity,A 和B(对话框式Activity)。

 

   从A进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume ,并不会调用onStop。

 

   按下back键,BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory回调:BonPause-->AonResume-->BonStop-->BonDestory。

 

启动对话框并不会有生命周期的变化,这里启动的是透明主题的Activity。

 

 

二、关于SaveStateInstance

   系统配置发生改变后或内存瓶颈时,生命周期发生异常,会调用onSaveInstanceState和onRestoreInstanceState这两兄弟,这就很好的解决Android应用的内存问题。

  旋转屏幕时,生命周期大概如下图(若不想,可在清单文件设置android:configChanges="orientation|keyboardHidden|locale"):

技术分享

 

 

  onSaveInstanceState:在Activity(onStop之前)被回收之前,系统会调用onSaveInstanceState(Bundle outState)来保存View的状态,并到传入的outState对象中。

  onRestoreInstanceState:在Activity被重新创建时,会通过onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)传入保存的状态信息并恢复View的状态。(onCreate主要重建Fragment、onRestoreInstanceState恢复Window状态)


  View控件的状态被保存需要满足两个条件:

1、View有唯一的ID;
2、View的初始化时要调用setSaveEnabled(true)

  View控件恢复的注意三点:

1、如果id重复,则View的状态会被覆盖

2、被保存的Fragment会在onCreate中被自动创建和添加到FragmentActivity中

3、被保存的View不会被自动创建,只是通过id获取savedInstance用于更新View

 













以上是关于android对应生命周期中应该释放哪些资源的主要内容,如果未能解决你的问题,请参考以下文章

详解Android Activity生命周期

Android进程的生命周期

Android艺术——深看Activity的生命周期

Android生命周期

鸿蒙HarMonyOS的Page Ability生命周期

Android基础 - activity生命周期