Android Activity的生命周期

通过上一节“Android系列之四:Android项目的目录结构”我们已经知道了什么是Activity,那么为什么我们创建一个Activity的导出类的时候为什么都要覆盖Activity的onCreate方法呢,为什么会在onPause()方法中保存一些当前Activity中的变化,要弄明白这些就要先了解Activity的生命周期,也就是一个Activity才开始到结束都要经过那些状态,下面通过一个例子了解Activity的声明周期.

Activity的生命周期方法

Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等。这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法。粗粒度的周期方法有以下几个:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(),从名字上就可以看出来这些方法在什么时候执行。

测试Activity的生命周期方法的执行顺序

为了能更明白上这几个周期放的执行顺序,我们新建一个HelloWorld项目,在Activity中覆盖这几个方法,打印出日志就可以看出来执行顺序了

新建HelloWorld项目,详细步骤可以参见:Android第一个Android应用,HelloWorld

修改main.xml内容为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<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>

这里主要是为增加一个文本显示和一个按钮用于显示信息和操作。

新建布局文件second.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <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。

新建一个Activity,名字为SecondActivity,内容如下:

public class SecondActivity extends Activity {
	private final static String TAG="SecondActivity";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.v(TAG, "onCreate");
		setContentView(R.layout.second);
		//退出按钮
		Button btnExit=(Button)findViewById(R.id.exit);
		//为退出按钮设置单击事件
		btnExit.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();//关闭当前Activity,也就是退出
			}
		});
	}
	@Override
	protected void onStart() {
		super.onStart();
		Log.v(TAG, "onStart");
	}
	@Override
	protected void onResume() {
		super.onResume();
		Log.v(TAG, "onResume");
	}
	@Override
	protected void onPause() {
		super.onPause();
		Log.v(TAG, "onPause");
	}
	@Override
	protected void onStop() {
		super.onStop();
		Log.v(TAG, "onStop");
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.v(TAG, "onDestroy");
	}

}

我在各个周期方法了都加了日志信息,便于跟踪Activity的运行过程

修改HelloWorld类,内容如下:

public class HelloWorld extends Activity {
	private final static String TAG="HelloWorld";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v(TAG, "onCreate");
        setContentView(R.layout.main);
        //打开第二个Activity的按钮
        Button btnSecond=(Button)findViewById(R.id.second);
        //设置单击事件
        btnSecond.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				startActivity(new Intent(HelloWorld.this,SecondActivity.class));
				finish();//关闭当前Activity
			}
		});
    }
	@Override
	protected void onStart() {
		super.onStart();
		Log.v(TAG, "onStart");
	}
	@Override
	protected void onResume() {
		super.onResume();
		Log.v(TAG, "onResume");
	}
	@Override
	protected void onPause() {
		super.onPause();
		Log.v(TAG, "onPause");
	}
	@Override
	protected void onStop() {
		super.onStop();
		Log.v(TAG, "onStop");
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.v(TAG, "onDestroy");
	}
}

运行程序,分析结果,发现当程序启动的时候,日志信息为下图:

由此可见当打开一个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的应用程序列表。

分析结果

根据上面例子可见一个Activity在启动的时候会执行onCreate()->onStart()->onResume(),在结束(或离开)的时候会执行onPause()->onStop()->onDestroy(),这就是一个Activity的生命周期。

因此我们要在onCreate方法里把Activity的需要的东西准备好,也就是初始化;在onResume里对Activity里的东西做一些调整;在onPause做一些清理和保存工作(保存持久状态),因为这是最后的机会,因为onPause完成之前Android不会结束托管Activity类的进程,而之后进程可能被结束。总结一下这几个周期方法的作用:

  1. onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
  2. onStart():Activity在屏幕上对用户可见时调用
  3. onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部。
  4. onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
  5. onStop():Activity被停止或者Activity变成不可见时调用
  6. onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候

好了,最后让我们看一个API提供的Activity的状态图吧,看了他相信你对Activity的生命周期会更了解,如下图:

小结

这节主要是通过一个例子分析Activity声明周期,并对常用生命周期方法做了一些说明,应该什么时候使用他们。到这里Android的很基础的东西已经说完了, 下面就直接Android的UI组件介绍了。。

下期预告:TextView的介绍–包含跑马灯效果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏酷玩时刻

微信、支付宝App支付-JPay0.0.2发布JPay

对微信App支付、支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调

13540
来自专栏知识分享

android客服端+eps8266+单片机+路由器之远程控制系统

用android客服端+eps8266+单片机+路由器做了一个远程控制的系统,因为自己是在实验室里,所以把实验室的门,灯做成了远程控制的。 控制距离有多远---...

76060
来自专栏分享达人秀

探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有...

35340
来自专栏james大数据架构

Android中BroadcastReceiver广播

BroadCastReceiver 简介 广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用...

22850
来自专栏何俊林

记一次重构:Android实践从MVC架构到MVP架构

一直以来,想分享MVP的实战,因为很多项目开始并不是就是mvp架构的,可能是从传统的mvc结构变迁过来的。今天呈详给大家分享的这篇从mvc重构到mvp,让大家既...

28450
来自专栏CodingBlock

Android学习笔记(五)Fragment简介

  Fragment是在Android 3.0 (API level 11)中引入的Activity的子模块。初衷是为了适应大屏幕的平板电脑,我们只需要使用Fr...

22280
来自专栏Android点滴积累

Android Toast cancel和show 不踩中不会知道的坑

说到Android Toast,几乎都很熟悉吧,下面讲讲怎么实现下面几种场景: 1、连续点击一个按钮,每次都产生一个新的Toast并且调用show方法 问题:...

36960
来自专栏Android源码框架分析

Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制

App在后台久置后,再次从桌面或最近的任务列表唤醒时经常会发生崩溃,这往往是App在后台被系统杀死,再次恢复的时候遇到了问题,而在使用FragmentActiv...

22830
来自专栏小巫技术博客

Activity生命周期

10830
来自专栏Vamei实验室

安卓第六夜 凡高的自画像

在上一讲中,我已经制作了一个简单的Android应用。项目的主要文件包括: MainActivity.java activity_main.xml 在这一讲,我...

21770

扫码关注云+社区

领取腾讯云代金券