Chinaunix首页 | 论坛 | 博客
  • 博客访问: 847866
  • 博文数量: 366
  • 博客积分: 10267
  • 博客等级: 上将
  • 技术积分: 4290
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:04
文章分类

全部博文(366)

文章存档

2012年(366)

分类: 系统运维

2012-03-21 18:27:00

Activity,作为android最基本组件之一,其生命周期对初学者来说往往是一个比较概念性的东西,在面试中也经常会碰到这样那样的生命周期问题。但是Android为什么要有生命周期这种机制?

  Activity有三种状态:

  1.运行状态:

    当Activity在屏幕的最前端时(位于当前堆栈的顶部),它是可见的,有焦点的,可以用来处理用户操作。Android内核会尽全力来保证运行状态的Activity运行。

  2.暂停状态:

    在某些情况下,Activity对用户来说还是可见的,只是没有焦点,这时候Activity处于暂停状态。例如当最前端的Activity是半透明或者Dialog形式,没有全部遮挡后面的    Activity。这时后面的Activity是可见的,处于暂停状态。当内存不足时,可能会被杀死。

  3.停止状态:

    当Activity完全不可见时,它就处于停止状态。当内存不足时,可能会被杀死。

  Activity的生命周期事件:7个

  • void onCreate(Bundle saveInstanceState);
  • void onStart();
  • void onRestart();
  • void onResume();
  • void onPause();
  • void onStop();
  • void onDestory();

  下面是Google官方文档里提供的Activity生命周期的图解

  

  当打开一个Activity时,首先触发的是onCreate()->onStart()->onResume() 此时Acitivity处于运行状态。

  下面通过代码在控制台输出LOG信息来更明了的观察Activity的生命周期

  ActivityLifeActivity:

View Code
package com.wudi.life;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ActivityLifeActivity extends Activity {
/** Called when the activity is first created. */
Button other,exit;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
other=(Button)findViewById(R.id.button1);
exit=(Button)findViewById(R.id.button2);
other.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(ActivityLifeActivity.this,OtherActivity.class));
}
});
exit.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
Log.i("info", "onStart");
super.onStart();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
Log.i("info", "onRestart");
super.onRestart();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
Log.i("info", "onResume");
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.i("info", "onPause");
super.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Log.i("info", "onStop");
super.onStop();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.i("info", "onDestory");
super.onDestroy();
}

}

  代码中重写了Activity的7个生命周期方法,并且有两个按钮,other用于跳转到OtherActivity, exit用于退出当前Activity

  OtherActivity:

View Code
package com.wudi.life;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class OtherActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i("info", "Other-onCreate");
TextView tv=new TextView(this);
tv.setText("other activity");
setContentView(tv);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
Log.i("info", "Other-onStart");
super.onStart();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
Log.i("info", "Other-onRestart");
super.onRestart();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
Log.i("info", "Other-onResume");
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.i("info", "Other-onPause");
super.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Log.i("info", "Other-onStop");
super.onStop();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.i("info", "Other-onDestory");
super.onDestroy();
}

}

  我们首先把OtherActivity设置成Dialog样式来观察生命周期的调用

  AndroidManifest.xml

<activity android:name=".OtherActivity" label="other"
android:theme
="@android:style/Theme.Dialog">activity>

  程序运行时:

  

  当点击exit或者按下返回键时:

  


  可见Activity在退出时:onPause()->onStop()->onDestory()

  当点击other时:跳转到新的activity,但之前的Activity还处于可见状态,只是失去焦点。此时为暂停状态。

  

此时ActivityLifeActivity处于暂停状态,调用onPause(),OtherActivity处于运行状态

如果把OtherActivity的样式改为默认

<activity android:name=".OtherActivity" label="other">activity>

再查看控制台的相关信息

比暂停状态多触发一个onStop(),此时ActivityLifeActivity处于停止状态。

在OtherActivity按下返回键

由此可见

1.当Activity从创建到运行状态:onCreate()->onStart()->onResume().

2.当Activity从运行状态到停止状态:onPause()->onStop()->onDestory().

3.当Activity从停止状态到运行状态:onRestart()->onStart()->onResume().

4.当Activity从运行状态到暂停状态:onPause().

5.当Activity从暂停状态到运行状态:onResume().

  生命周期看似简单。运用起来就要看你对它的理解了。当有一些在应用创建初期就要处理好的事情。可以放在onCreate()中执行,或者在关闭程序前你有一些数据保存要做,可以放在onStop()中,在相应的时期做相应的事件,便于管理,也让程序的执行有条不紊。而且可以更加安全高效的进行内存管理,合理的使用释放内存,比如在Activity销毁时将用到的cursor,打开的文件进行释放。使手机运行在最佳状态。

阅读(562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~