Android基础-Activity生命周期

旁白

想通过写博客去反映自己所学的东西,去记录自己一点一滴的进步。

Activity生命周期

Activity类中总共定义了7个回调方法,下面对这7个方法进行详细介绍,并通过例子使我们更好地理解Activity的生命周期。

onCreate()

这个会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

onStart()

这个方法在活动由不可见变为可见的时候调用。

onResume()

这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的
栈顶,并且处于运行状态。

onPause()

这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方
法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度
一定要快,不然会影响到新的栈顶活动的使用。

onstop()

这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如
果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop()
方法并不会执行。

onDestroy()

这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

onRestart

这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。

完整生存期

活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情
况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完
成释放内存的操作。

可见生存期

活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存
期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两
个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载,
而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。

前台生存期

活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台
生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时
看到和接触最多的也这个状态下的活动。

为了帮助你能够更好的理解,Android 官方提供了一张活动生命周期的示意图,如下图所示。

在这里插入图片描述

下面用一个例子进行更深刻的理解

先新建一个Android项目,我们还需要分别再创建两个子活动,NormalActivity 和
DialogActivity,下面一步步来实现。

新建 normal_layout.xml 文件,代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:orientation="vertical" >
		<TextView
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="This is a normal activity"
		/>
</LinearLayout>

然后同样的方法,我们再新建一个 dialog_layout.xml 文件,代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:orientation="vertical" >
		<TextView
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="This is a dialog activity"
		/>
</LinearLayout>

两个布局文件的代码几乎没有区别,只是显示的文字不同而已。
然后新建 NormalActivity 继承自 Activity,代码如下所示:

public class NormalActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	requestWindowFeature(Window.FEATURE_NO_TITLE);
	setContentView(R.layout.normal_layout);
	}
}

我们在 NormalActivity 中加载了 normal_layout 这个布局。
同样的方法,再新建 DialogActivity 继承自 Activity,代码如下所示:

public class DialogActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	requestWindowFeature(Window.FEATURE_NO_TITLE);
	setContentView(R.layout.dialog_layout);
	}
}

我们在 DialogActivity 中加载了 dialog_layout 这个布局。
其实从名字上你就可以看出,这两个活动一个是普通的活动,一个是对话框式的活动。
可是现在不管怎么看,这两个活动的代码都几乎都是一模一样的,在哪里有体现出将活动设成对话框式的呢?别着急,下面我们马上开始设置。在 AndroidManifest.xml 的标签中添加如下代码:

<activity android:name=".NormalActivity" >
</activity>
<activity android:name=".DialogActivity" android:theme="@android:style/
Theme.Dialog" >
</activity>

这里分别为两个活动进行注册,但是 DialogActivity 的注册代码有些不同,它使用了一
个 android:theme 属性,这是用于给当前活动指定主题的,Android 系统内置有很多主题可以
选择,当然我们也可以定制自己的主题,而这里@android:style/Theme.Dialog 则毫无疑问是
让 DialogActivity 使用对话框式的主题。
接下来我们修改 activity_main.xml,重新定制我们主活动的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:orientation="vertical" >
			<Button
				android:id="@+id/start_normal_activity"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:text="Start NormalActivity" />
			<Button
				android:id="@+id/start_dialog_activity"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:text="Start DialogActivity" />
</LinearLayout>

自动生成的布局代码有些复杂,这里我们完全替换掉,仍然还是使用最熟悉的 LinearLayout,
然后加入了两个按钮,一个用于启动 NormalActivity,一个用于启动 DialogActivity。
最后修改 MainActivity 中的代码,如下所示:

public class MainActivity extends Activity {

	public static final String TAG = "MainActivity";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	Log.d(TAG, "onCreate");
	requestWindowFeature(Window.FEATURE_NO_TITLE);
	setContentView(R.layout.activity_main);
	Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
	Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
	startNormalActivity.setOnClickListener(new OnClickListener() {
		@Override
		public void onClick(View v) {
		Intent intent = new Intent(MainActivity.this,
		NormalActivity.class);
		startActivity(intent);
		}
	});
	startDialogActivity.setOnClickListener(new OnClickListener() {
		@Override
		public void onClick(View v) {
		Intent intent = new Intent(MainActivity.this,
		DialogActivity.class);
		startActivity(intent);
		}
	});
}

	@Override
	protected void onStart() {
	super.onStart();
	Log.d(TAG, "onStart");
	}
	
	@Override
	protected void onResume() {
	super.onResume();
	Log.d(TAG, "onResume");
	}
	
	@Override
	protected void onPause() {
	super.onPause();
	Log.d(TAG, "onPause");
	}
	
	@Override
	protected void onStop() {
	super.onStop();
	Log.d(TAG, "onStop");
	}
	
	@Override
	protected void onDestroy() {
	super.onDestroy();
	Log.d(TAG, "onDestroy");
	}
	
	@Override
	protected void onRestart() {
	super.onRestart();
	Log.d(TAG, "onRestart");
	}
}

在 onCreate()方法中,我们分别为两个按钮注册了点击事件,点击第一个按钮会启动
NormalActivity,点击第二个按钮会启动 DialogActivity。然后在 Activity 的七个回调方法中分别打印了一句话,这样就可以通过观察日志的方式来更直观地理解活动的生命周期。
现在运行程序,效果下图所示:
在这里插入图片描述
这时观察 LogCat 中的打印日志
在这里插入图片描述
可以看到,当MainActivity第一次被创建时会依次执行onCreate()、onStart()和onResume()方法。然后点击第一个按钮,启动 NormalActivity

在这里插入图片描述
此时的打印信息如图
在这里插入图片描述
由于 NormalActivity 已经把 MainActivity 完全遮挡住,因此 onPause()和 onStop()方法都
会得到执行。然后按下 Back 键返回 MainActivity,打印信息如下图
在这里插入图片描述
由于之前 MainActivity 已经进入了停止状态,所以 onRestart()方法会得到执行,之后又
会依次执行onStart()和onResume()方法。注意此时onCreate()方法不会执行,因为MainActivity
并没有重新创建。
然后再点击第二个按钮,启动 DialogActivity
在这里插入图片描述
此时观察打印信息

在这里插入图片描述

以看到,只有 onPause()方法得到了执行,onStop()方法并没有执行,这是因为
DialogActivity 并没有完全遮挡住 MainActivity,此时 MainActivity 只是进入了暂停状态,并没有进入停止状态。相应地,按下 Back 键返回 MainActivity 也应该只有 onResume()方法会得到执行,如图:
在这里插入图片描述

最后在 MainActivity 按下 Back 键退出程序,打印信息如图:
在这里插入图片描述
依次会执行 onPause()、onStop()和 onDestroy()方法,最终销毁 MainActivity。

这就是活动完整的生命周期

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值