一,概述
毫无疑问,Activity一定是Android四大组件中最最重要的组件,也是每个Android开发者最先接触的组件。今天自己就写一篇关于Activity组件的博客,其它三个组件也会在后续写在博客上。
二,Activity的生命周期
先贴一张Activity的生命周期图,这张图来自Android SDK。
其实我们开发者接触最多的就是onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy()就是这六个方法了,这六个方法也称为Activity的完整生命周期,正常情况下就是按照这种顺序执行。贴一段代码,代码中对每个方法的作用都做了注释,代码如下:
package com.bighuan.review;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static String TAG = "MainActivity";
/**
* 每个Activity的入口,加载资源,做一些初始化操作
*
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate()方法执行了");
setContentView(R.layout.activity_main);
}
/**
* 界面由不可见到可见
*/
@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()方法执行了");
}
/**
* 销毁当前Activity(界面),可在这个方法做一些资源释放的操作
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy()方法执行了");
}
}
当我们第一次进入这个Activity时,控制台打印了如下日志:
03-11 13:26:28.045 2383-2383/com.bighuan.review D/MainActivity: onCreate()方法执行了
03-11 13:26:28.120 2383-2383/com.bighuan.review D/MainActivity: onStart()方法执行了
03-11 13:26:28.120 2383-2383/com.bighuan.review D/MainActivity: onResume()方法执行了
可以看到当我们进入前面三个方法执行,而当我们退出这个Activity时呢?
03-11 13:29:36.819 2383-2383/com.bighuan.review D/MainActivity: onPause()方法执行了
03-11 13:29:36.887 2383-2383/com.bighuan.review D/MainActivity: onStop()方法执行了
03-11 13:29:36.887 2383-2383/com.bighuan.review D/MainActivity: onDestroy()方法执行了
这时执行了后三个方法,到此就验证了我们的完整生命周期。
三,Activity生命周期的分类
1,完整生命周期(entire lifetime):onCreate()-->onStart()-->onResume()-->onPause-->onStop-->onDestroy()。
2,可视生命周期(visible lifetime):onStart()-->onResume()-->onPause-->onStop。
3,前台生命周期(foreground lifetime):onResume()-->onPause。
四,Activity的四种启动模式
1,启动模式之standard, 默认标准的启动模式。
绝大多数的Activity都是采用的standard的启动模式,开启新的Activity,这个Activity就会被加载到任务栈的栈顶。返回退出Activity,就从任务栈里面移除。如果任务栈清空,应用程序退出。
应用场景:绝大多数默认的情况。
2,启动模式之singleTop。
顶部只有一个实例存在,如果这个Activity的实例已经被加入到任务栈的栈顶,这个Activity就不会被重新创建。
应用场景:一个界面避免重复的开启很多次。singletop。 浏览器的书签
3,启动模式之singleTask。
单一任务栈: 在任务栈里面只可以有1个实例存在
如果没有实例,就创建,加入到任务栈的栈顶;如果有实例已经存在,就直接复用这个实例,然后清空这个实例上面所有的Activity。
应用场景: 如果一个Activity的内存开销或者是cpu开销非常大。一般我们设置这个Activity为singletask的启动模式。保证任务栈里面只有一个实例存在。浏览器的BrowserActivity内存开销非常大。webkit 浏览器的内核。 解析html标签。解析css标签。JavaScript解析引擎。
4,启动模式之singleinstance。
前面的3种启动模式Activity都是运行在当前的应用程序默认任务栈里面。singleinstance 则是自己单独开启一个任务栈运行。在自己的单独的任务栈里面运行,整个手机操作系统里面只可能同时存在一个singleinstance实例的Activity。
应用场景: 有道词典,快速取词,通话界面。