android Activity 生命周期探索

1.Activity的生命周期


Activity的生命周期: OnCreate(),OnStart(),OnResume(),running,OnPause(),OnStop(),OnRestart(),OnDestory(),System kill.

探索程序:
1)按照向导一步步来建立一个helloworld,
2)

MainActivity.java

package com.example.testactivitylife;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity ";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Log.d(TAG, TAG + "onCreate()");  
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		
		Intent intent = new Intent();
		intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
		intent.setClass(this, Activity2.class);
		startActivity(intent);
		
		return super.onOptionsItemSelected(item);
	}

	@Override
	protected void onStart() {
        Log.d(TAG, TAG + "onStart()");
		super.onStart();
	}

	@Override
	protected void onRestart() {
        Log.d(TAG, TAG + "onRestart()");
		super.onRestart();
	}

	@Override
	protected void onResume() {
        Log.d(TAG, TAG + "onResume()");
		super.onResume();
	}

	@Override
	protected void onPause() {
        Log.d(TAG, TAG + "onPause()");
		super.onPause();
	}

	@Override
	protected void onStop() {
        Log.d(TAG, TAG + "onStop()");
		super.onStop();
	}

	@Override
	protected void onDestroy() {
        Log.d(TAG, TAG + "onDestroy()");
		super.onDestroy();
	}
    
}

Activity2.java

package com.example.testactivitylife;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class Activity2 extends Activity {

	private static final String TAG = "Activity2 ";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(TAG, TAG + "onCreate()");
        
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

	@Override
	protected void onStart() {
        Log.d(TAG, TAG + "onStart()");
		super.onStart();
	}

	@Override
	protected void onRestart() {
        Log.d(TAG, TAG + "onRestart()");
		super.onRestart();
	}

	@Override
	protected void onResume() {
        Log.d(TAG, TAG + "onResume()");
		super.onResume();
	}

	@Override
	protected void onPause() {
        Log.d(TAG, TAG + "onPause()");
		super.onPause();
	}

	@Override
	protected void onStop() {
        Log.d(TAG, TAG + "onStop()");
		super.onStop();
	}

	@Override
	protected void onDestroy() {
        Log.d(TAG, TAG + "onDestroy()");
		super.onDestroy();
	}
    
	/**
	 * 当点击菜单选项的时候执行
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Intent intent = new Intent();
		intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
		intent.setClass(this, MainActivity.class);
		startActivity(intent);
		
		return super.onOptionsItemSelected(item);
	}
    
    
}

解释一下代码:

在MainActivity.java里面,我重写了OnCreate(),OnStart(),OnResume(),OnPause(),OnStop(),OnDestory()函数,在函数体内添加了日志代码Log.d()。

Activity2.java,除了类名,其他都跟MainActivity一样,当然,intent.setClass(this, MainActivity.class);这句Activity跳转的也不一样。


程序启动后,当点击菜单的选项时,会跳转到Activity2,在Activity2点击菜单,会跳转到MainActivity。

注意哦,我这里跳转Flag设定的是:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
表示,如果已经有一个Activity的实例在运行,那么就将这个实例弄到最前台,即用户可以看见。如果没有的话就创建一个。


Log类是Android用来记录日志用的,你可以简单认为是一个System.out.println(),Log有很多级别,比如说警告,错误,信息,调试等等。


2.行为和结果分析:


2.1) 程序启动的时候结果:

11-13 12:20:51.410: D/MainActivity(605): MainActivity onCreate()
11-13 12:20:51.410: D/MainActivity(605): MainActivity onStart()
11-13 12:20:51.420: D/MainActivity(605): MainActivity onResume()
由此可见创建Activity 的顺序是:OnCreate()->OnStart()->OnResume()->Activity正在运行,用户可见。

此时,app的Activity栈(保存程序的所有的启动的activity,栈的结构可以百度一下)只有MainActivity一个成员。


2.2)点击菜单选项,切换到Activity2

11-13 13:34:01.312: D/MainActivity(287): MainActivity onPause()
11-13 13:34:01.381: D/Activity2(287): Activity2 onCreate()
11-13 13:34:01.381: D/Activity2(287): Activity2 onStart()
11-13 13:34:01.381: D/Activity2(287): Activity2 onResume()
11-13 13:34:01.732: D/MainActivity(287): MainActivity onStop()

activity切换的步骤是,原来的activity OnPause()->新的activity OnCreate()->OnStart()->OnResume()->新的Activity正在运行,用户可见->原来的activity OnStop(),

从上面可以看到原来的那个Activity最后的一个步骤是OnStop(),但是为什么很多资料都说要在OnPause()里面作activity的保存工作呢?

这是因为在新的Activity OnCreate的时候,如果内存不足,系统有可能会将原来的Activity给KILL掉,这样,原来的Activity就没有机会执行OnStop()和OnDestory()了,所以,大家记得要在OnPause里面作保存工作哦。

此时,系统的activity栈已经有两个activity了,最上面的那个是activity2,即用户看见的那个,最下面那个是MainActivity。

好了,现在我们在Activity2点击返回按钮,会发生什么呢?


2.3)点击返回按键,返回到MainActivity

11-13 13:35:50.351: D/Activity2(287): Activity2 onPause()
11-13 13:35:50.464: D/MainActivity(287): MainActivity onRestart()
11-13 13:35:50.464: D/MainActivity(287): MainActivity onStart()
11-13 13:35:50.464: D/MainActivity(287): MainActivity onResume()
11-13 13:35:50.872: D/Activity2(287): Activity2 onStop()
11-13 13:35:50.872: D/Activity2(287): Activity2 onDestroy()
顺序大家都看的清楚,重要的一点事,在我们按返回的时候,activity2被系统destory了,所以,android规则是,按返回=销毁当前activity,返回activity栈里的下一个activity,我们这里是MainActivity。


2.4)点击菜单选项,进入Activity2,(这个步骤2.2已经做过,就不说了),点击菜单按钮,进入MainActivity。

这个和2.3的区别是,在2.3我们是按返回,回到MainActivity的,在这里我们是自己切换过去的,由于我们设置activity切换的FLAG是FLAG_ACTIVITY_REORDER_TO_FRONT。这表示在切换activity的时候,如果原来这个activity已经启动过,那么就将这个activity提到最前面来(用户可见),而不是又重新再创建一个,不同的FLAG会有不同的效果。

11-13 13:43:40.791: D/Activity2(287): Activity2 onPause()
11-13 13:43:40.841: D/MainActivity(287): MainActivity onRestart()
11-13 13:43:40.841: D/MainActivity(287): MainActivity onStart()
11-13 13:43:40.855: D/MainActivity(287): MainActivity onResume()
11-13 13:43:41.112: D/Activity2(287): Activity2 onStop()
用这种方法,activity2不会被系统destory掉,现在app的activity栈结构是,Activity2在最下面,最上面的是MainActivity,

在种情况下按返回会有什么效果?根据上面的经验,应该是返回到activity栈的下面一层,即activity2,对吗?

11-13 13:45:41.931: D/MainActivity(287): MainActivity onPause()
11-13 13:45:42.031: D/Activity2(287): Activity2 onRestart()
11-13 13:45:42.031: D/Activity2(287): Activity2 onStart()
11-13 13:45:42.031: D/Activity2(287): Activity2 onResume()
11-13 13:45:42.441: D/MainActivity(287): MainActivity onStop()
11-13 13:45:42.441: D/MainActivity(287): MainActivity onDestroy()
我们的结论是正确的,我们可以看到,最上面的Activity(MainActivity)被Destory了,现在app就只有一个Activity2保存在activity栈里面了。

我们再按一次返回会有什么效果?

11-13 13:47:10.356: D/Activity2(287): Activity2 onPause()
11-13 13:47:11.033: D/Activity2(287): Activity2 onStop()
11-13 13:47:11.033: D/Activity2(287): Activity2 onDestroy()

这下所有的程序activity栈里面所有的activity都被销毁了,于是程序也退出了。


通过上面的分析,我们可以得到的结论有:

对于一个Activity生命周期有:

OnCreate()->OnStart()->OnResume()->运行->OnPause()->OnStop()->OnDestory()

其中在OnStop()的时候可以被重新启动OnStop()->OnRestart()->OnStart()->OnResume()......


通过按返回键我们可以当前的activity(其实也可以调用Destory方法),在调用完所有activity的destory方法后,程序退出。


你可能感兴趣的:(android Activity 生命周期探索)