浅谈Android Activity的生命周期
2017-03-27 本文已影响0人
PassersHowe
前言:本文所写的是博主的个人见解,如有错误或者不恰当之处,欢迎私信博主,加以改正! 原文链接,demo链接
谈到关于Activity的生命周期,相信很多朋友都看到过这样的图了,如下图:
![Activity生命周期图][1]
[1]: http://www.passershowe.com/img/activity_lifecycle.png
下面谈谈Activiy生命周期的函数
- onCreate()
在Activity第一次创建时调用,通常会在该函数中进行一些初始操作:如创建视图,将数据绑定到列表,绑定事件等。提供了一个包含Activity之前冻结状态的Bundle(如果有的话)。 - onStart()
该函数在onCreate()函数被调用之后被调用,当Activity对用户变得可见时调用。如果Activity来到前台,则继续执行onResume(),如果隐藏,则返回onStop()。 - onResume()
当Activity变为可见,开始与用户进行交互时调用,即Activity处于Activity堆栈的顶部,用户输出将进入该Activity的堆栈。 - onPause()
该函数在系统准备启动或者恢复之前的Activity时调用。通常会在这个函数提交未保存更改持久性数据,停止动画和可能耗用CPU等的其他事情。 - onStop()
该函数在Activity 对用户不可见时调用,因为另一个Activity已被恢复并覆盖了当前Activity。 - onRestart()
该函数在你的Activity停止后,再次启动之前调用。 - onDestory()
该函数在Activity被销毁之前调用,之后Activity的状态将变为销毁状态,通常在执行finish()方法或者系统为了节省空间,销毁了Activity。可以通过isFinishing()方法来区分。
Activity生命周期的几个过程
一个简单的demo,代码如下
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate");
Toast.makeText(getApplicationContext(), "onCreate", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
Toast.makeText(getApplicationContext(), "onStart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
Toast.makeText(getApplicationContext(), "onResume", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
Toast.makeText(getApplicationContext(), "onPause", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop");
Toast.makeText(getApplicationContext(), "onStop", Toast.LENGTH_SHORT).show();
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart");
Toast.makeText(getApplicationContext(), "onRestart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
Toast.makeText(getApplicationContext(), "onDestroy", Toast.LENGTH_SHORT).show();
}
}
- Activity正常启动过程
onCreate() -> onStart() -> onResume(),Activity处于运行状态
2.Activity 退居后台时
当前Activity跳转到其他的非对话框式的Activity,onPause() -> onStop() - 当前Activity重新返回前台时
onRestart() -> onStart() -> onResume(),重新回到运行状态 - 当用户按home键时
onPause() -> onStop(),此时Activity退居后台 - 当用户锁屏再解锁时
用户按锁屏键 -> onPause() -> onStop() -> 用户按解锁键 -> onRestart() -> onStart() -> onResume(),Activity再次回到前台 - 当前Activity退居后台,启动对话框式的Activity,返回当前Activity时
onPause() -> onResume(),Activity再次回到前台 - Activity退居后台,且系统内存不足
系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会执行onCreate() -> onStart() -> onResume() - 用户退出应用或者被系统清理时
onPause() -> onStop() -> onDestroy(),Activity处于被销毁状态
Activity的四种启动模式
- standard 模式
Activity 启动的默认模式,可多次实例化,可以位于 Activity 堆栈中的任何位置。每次 "standard" Activity 有新的 Intent 时,系统都会创建新的类实例来响应该 Intent 。每个实例处理单个 Intent。 - singleTop 模式
可多次实例化,可以位于 Activity 堆栈中的任何位置,每次 "singleTop" Activity 有新的 Intent 时,如果目标任务在其堆栈顶部已有一个 Activity 实例,那么该实例将接收新Intent(通过调用 onNewIntent());此时不会创建新实例。如果 "singleTop" 的一个现有实例虽在目标任务内,但未处于堆栈顶部,或者虽然位于堆栈顶部,但不在目标任务中则系统会创建一个新实例并将其推送到堆栈上。 - singleTask 模式
始终位于Activity堆栈的根位置,一个设备只能保留一个Activity实例,只允许一个此类任务, "singleTask" Activity 允许其他 Activity 成为其任务组成部分 - singleInstance 模式
始终位于 Activity 堆栈的根位置,一个设备只能保留一个Activity实例,只允许一个此类任务, "singleInstance" Activity 不允许其他 Activity 成为其任务组成部分,它是任务中唯一的 Activity ,如果它启动另一个 Activity 系统会将该 Activity 分配给其他任务
注:standard 是默认模式并且适合大多数的 Activity 类型,singleTop 也是一个常见且有用的启动模式。singleTask 和 singleInstance 模式这不适合大多数应用,所形成的交互模式可能会让用户感到陌生。