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

2024-12-12 06:25:31
推荐回答(2个)
回答1:

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。

回答2:

这个线程使用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#类内部定义的字段,对象之类的,会和该类实例化对象放在一起。