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下面的下载地址

-------------本文结束  感谢您的阅读-------------
下次一定