Activity初探

Activity的介绍免了(想看点这里),下面直接上代码:

Activity的生命周期

在MainActivity以及SecondActivity中的各个生命周期方法中,用log的方式输出各自的方法名,根据输出的顺序,来观察生命周期方法调用的顺序: MainActivity
/**
 * @author sumile
 * @WEB https://sumile.cn
 * @2015年7月6日 上午10:58:06
 * @TODO
 */
public class MainActivity extends Activity {
	private final String TAG = "sumile";
	private TextView tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i(TAG, "MainActivity  OnCreate");
		tv = (TextView) findViewById(R.id.tv);
		tv.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 本方法于2015年7月6日 上午11:04:48由sumile建立
				Intent intent = new Intent(MainActivity.this, SecondActivity.class);
				startActivity(intent);
			}
		});
	}

	@Override
	protected void onStart() {
		// 本方法于2015年7月6日 上午10:59:43由sumile建立
		super.onStart();
		Log.i(TAG, "MainActivity  onStart");
	}

	@Override
	protected void onResume() {
		// 本方法于2015年7月6日 上午10:59:49由sumile建立
		super.onResume();
		Log.i(TAG, "MainActivity  onResume");

	}

	@Override
	protected void onPause() {
		// 本方法于2015年7月6日 上午10:59:55由sumile建立
		super.onPause();
		Log.i(TAG, "MainActivity  onPause");

	}

	@Override
	protected void onStop() {
		// 本方法于2015年7月6日 上午11:00:00由sumile建立
		super.onStop();
		Log.i(TAG, "MainActivity  onStop");

	}

	@Override
	protected void onDestroy() {
		// 本方法于2015年7月6日 上午11:00:03由sumile建立
		super.onDestroy();
		Log.i(TAG, "MainActivity  onDestroy");

	}

	@Override
	protected void onRestart() {
		// 本方法于2015年7月6日 上午11:00:07由sumile建立
		super.onRestart();
		Log.i(TAG, "MainActivity  onRestart");

	}

}
SecondActivity
/**
 * @sumile
 * @WEB https://sumile.cn
 * @2015年7月6日 上午11:01:44
 * @TODO
 */
public class SecondActivity extends Activity {
	private final String TAG = "sumile";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		Log.i(TAG, "SecondActivity  OnCreate");
	}

	@Override
	protected void onStart() {
		// 本方法于2015年7月6日 上午10:59:43由sumile建立
		super.onStart();
		Log.i(TAG, "SecondActivity  onStart");
	}

	@Override
	protected void onResume() {
		// 本方法于2015年7月6日 上午10:59:49由sumile建立
		super.onResume();
		Log.i(TAG, "SecondActivity  onResume");

	}

	@Override
	protected void onPause() {
		// 本方法于2015年7月6日 上午10:59:55由sumile建立
		super.onPause();
		Log.i(TAG, "SecondActivity  onPause");

	}

	@Override
	protected void onStop() {
		// 本方法于2015年7月6日 上午11:00:00由sumile建立
		super.onStop();
		Log.i(TAG, "SecondActivity  onStop");

	}

	@Override
	protected void onDestroy() {
		// 本方法于2015年7月6日 上午11:00:03由sumile建立
		super.onDestroy();
		Log.i(TAG, "SecondActivity  onDestroy");

	}

	@Override
	protected void onRestart() {
		// 本方法于2015年7月6日 上午11:00:07由sumile建立
		super.onRestart();
		Log.i(TAG, "SecondActivity  onRestart");

	}
}
运行成功后,在不同操作下,生命周期方法的调用顺序如下:
打开程序
07-06 11:16:18.541: I/sumile(4363): MainActivity  OnCreate
07-06 11:16:18.551: I/sumile(4363): MainActivity  onStart
07-06 11:16:18.551: I/sumile(4363): MainActivity  onResume

锁屏
07-06 11:16:48.941: I/sumile(4363): MainActivity  onPause
07-06 11:16:48.951: I/sumile(4363): MainActivity  onStop

开屏
07-06 11:17:15.871: I/sumile(4363): MainActivity  onRestart
07-06 11:17:15.871: I/sumile(4363): MainActivity  onStart
07-06 11:17:16.171: I/sumile(4363): MainActivity  onResume

点击按钮切换到第二Activity
07-06 11:17:29.441: I/sumile(4363): MainActivity  onPause
07-06 11:17:29.471: I/sumile(4363): SecondActivity  OnCreate
07-06 11:17:29.471: I/sumile(4363): SecondActivity  onStart
07-06 11:17:29.471: I/sumile(4363): SecondActivity  onResume
07-06 11:17:29.941: I/sumile(4363): MainActivity  onStop

返回键 返回到第一个Activity
07-06 11:18:08.141: I/sumile(4363): SecondActivity  onPause
07-06 11:18:08.151: I/sumile(4363): MainActivity  onRestart
07-06 11:18:08.151: I/sumile(4363): MainActivity  onStart
07-06 11:18:08.161: I/sumile(4363): MainActivity  onResume
07-06 11:18:08.541: I/sumile(4363): SecondActivity  onStop
07-06 11:18:08.541: I/sumile(4363): SecondActivity  onDestroy

返回键 关闭程序
07-06 11:18:32.821: I/sumile(4363): MainActivity  onPause
07-06 11:18:34.021: I/sumile(4363): MainActivity  onStop
07-06 11:18:34.061: I/sumile(4363): MainActivity  onDestroy

从以上我们可以看出,每次我们要打开一个新的Activity的时候,首先要把自己onPause,然后调用新的Activity的onCreate,onStart,onPause方法,新的Activity显示之后,再调用旧的Activity的onStop方法。当要返回的Activity是存在的,那么onCreate方法是不会被调用的,它会通过onRestart方法以及onStart方法从Stopped的状态转换为Started状态,再经过onResume方法成为可见状态。如下图(文档地址)所示:basic-lifecycle 下面,我们来仔细说下这段代码的含义,想一想为什么要这么写:
07-06 11:17:29.441: I/sumile(4363): MainActivity  onPause
07-06 11:17:29.471: I/sumile(4363): SecondActivity  OnCreate
07-06 11:17:29.471: I/sumile(4363): SecondActivity  onStart
07-06 11:17:29.471: I/sumile(4363): SecondActivity  onResume
07-06 11:17:29.941: I/sumile(4363): MainActivity  onStop

1.为什么要先把MainActivity给onPause了,才开始打开新的Activity

答:假设在MainActivity中我们正在播放一个视频,或是播放一首歌曲,这时候来电话了,如果按照我们的想法,电话的Activity经过onCreate,onStart,onResume之后呈现在我们眼前了,我们接通了电话,正要说话,发现我们的通话有了尴尬的背景音~~所以在新的Activity开始运行之前,我们就要先把旧的给暂停掉。

2.为什么在新的Activity成功运行之后才将旧的给stop掉

答:假设我们是程序,知道要打开一个Activity了,我们不留后路的先把我们当前正在显示的一个给关掉了,然后满怀欢喜的去打开那个新的,突然,duang~新的Activity崩溃了...新的没有打开,旧的还被关闭了。
测试代码下载请看Activity初探2下面的下载地址
AndroidStudio配置记录 2015-07-04
Activity初探2——Activity的启动方式 2015-07-06

评论区