Android开发中,Activity是第一位需要了解的,初学者可能直接继承使用Activity,也有部分人可以理解它的生命周期,但是大部分人还是对这个最常用组件模模糊糊。今天我们来深入了解一下Activity。
1、单一Activity生命周期
Activity是Android中与用户打交道的组件,它承载着直接向用户显示的任务,一般来说,我们呈现给用户看到的部分,绝大部分是由Activity或者间接由它实现的。我们首先看看Activity的生命周期。
一个Activity整体上要执行如下方法:onCreate()——>onStart()——>onResume()——>onPause()——>onStop()——>onDestroy()
这样纯粹的语言文字,看起来完全没有感觉,那么我们先看一副Google官方给我们的声明周期图片,如下:
前面说过,Activity在整体上执行了如上的六个方法,但是,我们在做应用开发的时候,绝大多数情况不会是只有一个界面的,当这个界面跳转到了另外一个界面的时候呢?那么,我们的生命周期就多了一些变化,如图上所示的分支,便是我们执行的规律。
2、方法的说明
onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。 onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。
onStart :该方法的触发表示所属活动将被展现给用户。
onResume :当一个活动和用户发生交互的时候,触发该方法。
onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
onDestroy :当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
3、多个Activity交叉运行
在Activity的运行中,如果我们离开A,那么A进入onPause()方法,B进入了onCreate()方法,这里我们先来看一幅图,这幅图是网上找来了,比上面官网给出的图示更加简洁,它先勾勒出了大致的运行流程,等我们先理解下面这幅图,在来说明每个Activity之间的运行关系。
如果有多个Activity运行,他们的关系如下所示(这里仅以两个Activity为例说明):
当另一个Activity启动时:
第一个Activity onPause()——>第二个Activity onCreate()——>onStart()——>onResume() ——>第一个Activity onStop()
当返回到第一个Activity时:
第二个Activity onPause()——>第一个Activity onRestart()——>onStart()——>onResume()——>第二个Activity onStop()——>onDestroy()
4、运行测试代码
这里给出Activity的一段运行的代码,读者可以根据这些基本的方法,在电脑上运行查看一下:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class ActivityDemo extends Activity {
private static final String TAG = "ActivityDemo";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e(TAG, "start onCreate~~~");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "start onStart~~~");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "start onRestart~~~");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "start onResume~~~");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "start onPause~~~");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "start onStop~~~");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "start onDestroy~~~");
}
}
5、经验总结
5.1 跳转刷新
当我们从Aactivity跳到Bactivity。由于Bactivity的操作,影响了Aactivity的数据,所以再回到A的时候,希望A中的数据能够进行刷新。但是系统在默认退出的时候,A中界面显示的数据还是上次的情况。 这个时候,如果我们重写Aactivity的onResume()方法,在onResume()方面里进行刷新操作。因为按照activity的生命周期模型,当activity恢复的时候,onResume()方法会被调用,所以这是一个刷新的好机会。
5.2 添加统计
使用过统计功能的同学,想必对下面的代码不会陌生,这里我们直接提供一段国内友盟的统计方案:
@Override
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
5.3 销毁情况
我们在使用Activity的时候,会发现有些程序会直接被系统回收,有些方法并没有被调用,是怎么回事呢?原理,Activity的销毁有以下三种情况:
(1)onPause()——><Process Killed>
(2)onPause()——>onStop()——><Process Killed>
(3)onPause()——>onStop()——>onDestroy()
在使用了一些安全软件,例如360手机卫士,腾讯手机管家等的时候,部分应用是会直接被杀掉的,并不会调用onStop()或者onDestory()方法。