说到生命周期,对于程序员来说并不陌生。如果学过Servlet的朋友,就更不会陌生了饿,其实差不多,android的生命周期与Servlet的生命周期有相似之处 。
Android的生命周期通常是有这样几个方法构成:onCreate()、onStart()、onPause()、onResume()、onStop()、onDestroy()、onRestart()等七个。也许大家还不清楚我们为什么要知道android的生命周期,也许大家这么认为,我管它是什么,我知道每次写Activity时总是在onCreate()中,最终也能把我的程序运行出来。这样认为也不错,但是要想在这android行业里深入发展的,我相信,只要是程序员,他肯定是先把生命周期弄清楚才吃得下饭,睡得安稳。
Android手机是2010年开始火爆上市,因为它的炫,很快成了手机行业的老大,又因为是基于在java语言上开发的,当然啦,我这么说是不对的,了解android的朋友都是知道的,我说的只是android的顶层应用层,而下面还有基于Linux的内核层、系统运行层即我们所说的C、C++库和Android运行库等构成。
从事java开发的朋友对查API文档来说是再熟悉不过了,android开发也同样离不开查看API文档。我说说我自己的经历吧,当初我刚开始学java语言的时候,什么也不懂,老师说什么面向对象,我觉得与C语言没有多大的区别呀,总是以为也是面向过程的,学到后面才知道,我们为什么说java面向对象的。那是一次面试题目,写出排序的方法,我那时基础也不好,就用面向过程来完成,回来和朋友交流的时候,朋友说了让我很惊呀,“啊?这么简单你还弄得那么复杂”我就纳闷啦,为什么啊?结果他告诉我,你去查查API文档的Collections类,下面应该有个sort()方法吧。我回去一查,呀,这么简单啊,让我自己弄的那么复杂,真不该啊。好啦,从那以后,让我弄清楚了面向对象和如何查API文档了。为什么说是面向对象呢?是因为你只要调用Collections.sort()方法就解决如何排序问题,而面向过程是需要自己写出每一步实现的过程;java里涵盖的类实在是太多太多了,我相信就连发现java的人都不会全部记得的,这时就需要查API文档了,如何查呢?只要模糊的知道某个类,就在该类下搜索,看看方法名、参数以及返回的对象,先地位再细看。就这么的简单。我希望大家不要去死记那些类,合理查API,一样是关羽,一样能过五关斩六将。
说了这么多的废话,大家也不耐烦了。下面我就用我自己所理解的方法给大家展示一下吧。
首先我创建第一个MainActivity类。
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "onCreate()");
Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
startActivity(intent);
}
});
Button threebutton = (Button) this.findViewById(R.id.threebutton);
threebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
Log.i(TAG, "onDestroy()");
super.onDestroy();
}
@Override
protected void onPause() {
Log.i(TAG, "onPause()");
super.onPause();
}
@Override
protected void onRestart() {
Log.i(TAG, "onRestart()");
super.onRestart();
}
@Override
protected void onResume() {
Log.i(TAG, "onResume()");
super.onResume();
}
@Override
protected void onStart() {
Log.i(TAG, "onStart()");
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "onStop()");
super.onStop();
}
}
其次,创建OtherActivity类,其代码如下:
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
}
}
最后,再创建ThreeActivity 类
public class ThreeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.three);
}
}
运行结果给大家看一下:
当然,我并不是让大家看运行后的界面,而是绕过大家看下后台的数据哦。
先来一步一步操作下,运行下android application,打开Logcat窗口(在Window下的Show View下Other...)如下图2个步骤:
1.
2.
点OK吧。
在状态栏看到下图标志的了吧。点击绿色的标志吧。
出现下图的
我在Filter Name一栏输入“MainActivity”的字符串,在by Log Tag也输入"MainActivity"字符串,点击OK。
我们看到了第一个运行是onCreate()方法,第二个是onStart()方法,第三个是onResume()方法。这是第一次运行MainActivity类。
当我点击按钮后,看下界面显示吧:
再来看下后台打印的数据啊:
前三个是刚才运行后的数据,第四条,是在我点击,从MainActivity调转到OtherActivity了,会执行OnPause()方法。接下来我返回到MainActivity界面中,看看又有什么变化:
是不是有第五条数据啦,这时事调用了OnResume()方法了。
我再来点击 ,看下前台界面有什么变化:
再来看下后台数据吧:
这时又多出了2条数据了,分别是onPause()和onStop()方法。当从MainActivity跳转到ThreeActivity类时,分别执行了onPause()和onStop()方法。再来返回到MainActivity类。看看后台数据有没有变化:
哇,看看打印出来的时间,就知道了,执行了三个方法,分别是onRestart()、onStart()、onResume()。
最后退出该程序吧,看看后台的数据吧:
打印了onDestroy()方法了,这时是销毁了。
好了,整个过程,我们也都看到了,我只是没有清除打印台,大家不要误解,我担心某些人错认为都是一次性执行的结果。
总结一下吧:
第一次执行该程序时:onCreate()-->onStart()-->onResume(),跳转到OtherActivity类时执行了onPause(),再从OtherActivity类返回到MainActivity类时执行了onResume();再跳转到ThreeActivity类时执行了onPause()、onStop(),再从ThreeActivity返回到MainActivity类时执行了onRestart()-->onStart()-->onResume();最后退出该程序时,执行了onDestroy()。
进一步的总结:
onCreate()是程序启动时就执行,一旦执行就不会在执行了,除非是销毁了才会执行;一旦离开Activity(无论是何Activity)时就会执行onPause();当又回到原始的那个类时,执行的是onResume()。其他的一目了然了。
好了,到这里了,应该理解了吧!
欢迎多来指点交流!