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对应生命周期中应该释放哪些资源的主要内容,如果未能解决你的问题,请参考以下文章