Android系列教程之Activity的生命周期
2015-11-05 14:22
429 查看
通过上一节“Android系列教程之Android项目的目录结构”我们已经知道了什么是Activity,那么为什么我们创建一个Activity的导出类的时候为什么都要覆盖Activity的onCreate方法呢,为什么会在onPause()方法中保存一些当前Activity中的变化,要弄明白这些就要先了解Activity的生命周期,也就是一个Activity才开始到结束都要经过那些状态,下面通过一个例子了解Activity的声明周期.
Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等。这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等
这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法。粗粒度的周期方法有以下几个:
onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(),从名字上就可以看出来这些方法在什么时候执行。
为了能更明白上这几个周期放的执行顺序,我们新建一个HelloWorld项目,在Activity中覆盖这几个方法,打印出日志就可以看出来执行顺序了
新建HelloWorld项目
2、修改activity_main.xml代码如下:
这里主要是为增加一个文本显示和一个按钮用于显示信息和操作。
3、新建布局文件second.xml,内容如下:
这里主要是为增加一个文本显示和一个退出按钮用于退出当前Activity。
4、新建一个Activity,名字为SecondActivity,要在AndroidManifest.xml也声明一下,否则报错:
SecondActivity类内容如下:
我在各个周期方法里都加了日志信息,便于跟踪Activity的运行过程
5、修改HelloWorld类,内容如下:
由此可见当打开第一个Activity的时候,其周期方法执行顺序为:onCreate()->onStart()->onResume(),现在点击“打开第二个Activity”按钮,看日志的输出如下图:
当应用从Helloworld这个Activity启动SecondActivity的时候,Android会先执行HelloWorld的onPause方法,然后依次执行SecondActivity的onCreate()->onStart()->onResume()方法
当SecondActivity呈现到屏幕上的时候再一次执行Helloworld的onStop()->onDestroy(),把HelloWorld从Activity栈中移除销毁。这里值得提的就是HelloWorld
中finish方法,因为执行了他所以
HelloWorld才会从Activity栈中移除销毁,这样当你按“返回”键返回的时候就回不到HelloWorld 这个Activity的界面了,而是直接回到的Android的应用程序列表 。
最后点击“退出”按钮,效果如下:
就直接回到的Android的应用程序列表了。
根据上面例子可见一个Activity在启动的时候会执行onCreate()->onStart()->onResume(),在结束(或离开)的时候会执行onPause()->onStop()->onDestroy(),这就是一个Activity的生命周期。
因此我们要在onCreate方法里把Activity的需要的东西准备好,也就是初始化;在onResume里对Activity里的东西做一些调整;在onPause做一些清理和保存工作(保存持久状态),因为这是最后的
机会,因为onPause完成之前Android不会结束托管Activity类的进程,而之后进程可能被结束。总结一下这几个周期方法的作用:
onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
onStart():Activity在屏幕上对用户可见时调用
onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部。
onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
onStop():Activity被停止或者Activity变成不可见时调用
onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候
好了,最后让我们看一个API提供的Activity的状态图吧,看了他相信你对Activity的生命周期会更了解,如下图:
这节主要是通过一个例子分析Activity声明周期,并对常用生命周期方法做了一些说明,应该什么时候使用他们。到这里Android的很基础的东西已经说完了!
一:Activity的生命周期方法
Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等。这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法。粗粒度的周期方法有以下几个:
onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(),从名字上就可以看出来这些方法在什么时候执行。
二:测试Activity的生命周期方法的执行顺序
为了能更明白上这几个周期放的执行顺序,我们新建一个HelloWorld项目,在Activity中覆盖这几个方法,打印出日志就可以看出来执行顺序了新建HelloWorld项目
2、修改activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第一个Activity" /> <Button android:id="@+id/second" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开第二个Activity" /> </LinearLayout>
这里主要是为增加一个文本显示和一个按钮用于显示信息和操作。
3、新建布局文件second.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第二个Activity" /> <Button android:id="@+id/exit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="退出" /> </LinearLayout>
这里主要是为增加一个文本显示和一个退出按钮用于退出当前Activity。
4、新建一个Activity,名字为SecondActivity,要在AndroidManifest.xml也声明一下,否则报错:
SecondActivity类内容如下:
import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class SecondActivity extends Activity{ private final static String TAG = "SecondActivity"; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.second); //退出按钮 Button btnExit = (Button) findViewById(R.id.exit); //为退出按钮设置单击事件 btnExit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //关闭当前Activity,也就是退出 finish(); } }); } //覆盖 android.app.Activity.onStart方法 protected void onStart(){ super.onStart(); Log.v(TAG, "onStart"); } //覆盖 android.app.Activity.onResume protected void onResume(){ super.onResume(); Log.v(TAG, "onResume"); } protected void onPause(){ super.onPause(); Log.v(TAG, "onPause"); } protected void onStop(){ super.onStop(); Log.v(TAG, "onStop"); } protected void onDestroy(){ super.onDestroy(); Log.v(TAG,"onDestroy"); } }
我在各个周期方法里都加了日志信息,便于跟踪Activity的运行过程
5、修改HelloWorld类,内容如下:
import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class HelloWorld extends Activity { private final static String TAG = "HelloWorld"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //打开第二个Activity的按钮 Button btnSecond = (Button) findViewById(R.id.second); btnSecond.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //跳转到SecondActivity startActivity(new Intent(HelloWorld.this,SecondActivity.class)); finish();//关闭当前Activity } }); } /* * 重写覆盖 android.app.Activity里的方法 * */ protected void onStart(){ super.onStart(); Log.v(TAG, "onStart"); } protected void onResume(){ super.onResume(); Log.v(TAG, "onResume"); } protected void onPause(){ super.onPause(); Log.v(TAG, "onPause"); } protected void onStop(){ super.onStop(); Log.v(TAG, "onStop"); } protected void onDestroy(){ super.onDestroy(); Log.v(TAG,"onDestroy"); } }6、运行程序,分析结果,发现当程序启动的时候,日志信息为下图:
由此可见当打开第一个Activity的时候,其周期方法执行顺序为:onCreate()->onStart()->onResume(),现在点击“打开第二个Activity”按钮,看日志的输出如下图:
当应用从Helloworld这个Activity启动SecondActivity的时候,Android会先执行HelloWorld的onPause方法,然后依次执行SecondActivity的onCreate()->onStart()->onResume()方法
当SecondActivity呈现到屏幕上的时候再一次执行Helloworld的onStop()->onDestroy(),把HelloWorld从Activity栈中移除销毁。这里值得提的就是HelloWorld
中finish方法,因为执行了他所以
HelloWorld才会从Activity栈中移除销毁,这样当你按“返回”键返回的时候就回不到HelloWorld 这个Activity的界面了,而是直接回到的Android的应用程序列表 。
最后点击“退出”按钮,效果如下:
就直接回到的Android的应用程序列表了。
三:分析结果
根据上面例子可见一个Activity在启动的时候会执行onCreate()->onStart()->onResume(),在结束(或离开)的时候会执行onPause()->onStop()->onDestroy(),这就是一个Activity的生命周期。因此我们要在onCreate方法里把Activity的需要的东西准备好,也就是初始化;在onResume里对Activity里的东西做一些调整;在onPause做一些清理和保存工作(保存持久状态),因为这是最后的
机会,因为onPause完成之前Android不会结束托管Activity类的进程,而之后进程可能被结束。总结一下这几个周期方法的作用:
onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
onStart():Activity在屏幕上对用户可见时调用
onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部。
onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
onStop():Activity被停止或者Activity变成不可见时调用
onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候
好了,最后让我们看一个API提供的Activity的状态图吧,看了他相信你对Activity的生命周期会更了解,如下图:
四:小结
这节主要是通过一个例子分析Activity声明周期,并对常用生命周期方法做了一些说明,应该什么时候使用他们。到这里Android的很基础的东西已经说完了!
相关文章推荐
- Android中的数据存储的五种方式
- 【Android4高级编程】(1)创建应用程序和Activity
- Android开发之onClick事件的三种写法
- 【Android开发笔记】pulltorefresh实现下拉刷新和上拉加载更多
- androidannotation study(1)---Activity, Fragment,Custom Class & Custom View
- 开发神器-Android Studio插件
- Android自定义属性attr的format取值类型
- Android动画之二:View Animation
- Android中GridView的一些特殊属性
- Android动画之一:Drawable Animation
- Android应用程序的编译过程分析
- Android-常用第三方库proguard-rules配置
- Android自定义控件之应用程序首页轮播图
- android studio提示unable to run mksdcard sdk
- [小技巧]Android 圆形progressbar的旋转的停止和启动
- Android Drawable 那些不为人知的高效用法
- Android 自定义View (一)
- android中Invalidate和postInvalidate的区别(转)
- Android layout、onLayout 一些简要说明(转)
- Android draw、onDraw、dispatchDraw、invalidate、computeScroll 一些简要说明(转)