Android基础一之Activity

经常网上找资料都比较散乱,所以就干脆自己整理一下留存一下了。
Activity:直译为“活动”的意思,通常表现在我们代码中为一个交互的界面;
Activity有这一套自己的生命周期,正常情况下按开始到结束的顺序有如下生命周期函数:
onCreate():activity正在被创建,在这个方法中,可以做一些初始化工作,如加载布局,初始化数据等;
onRestart:activity正在重新被创建,当前activity从不可见重新变为可见状态时被调用;
onStart:activity正在被启动,这时activity已经可见了,但还未出现在前台,无法和用户交互;
onResume:activity已经可见了,并且出现在前台可以和用户交互;
onPause:activity正在停止,还未被完全遮挡;此时可以做一些存储数据的工作,但不能太耗时;
onStop:activity即将停止,这时已经在前台不可见了,可以做些回收工作,但不能太耗时;
onDestory:activity即将被销毁,可以做一些回收工作和最终的资源释放。
各个生命周期函数如下图:
Android基础一之Activity
结合log日志来说明:
1、第一次启动,onCreate -> onStart -> onResume;
Android基础一之Activity
按系统back键:onPause -> onStop -> onDestroy;
Android基础一之Activity
按系统home键:onPause -> onStop
Android基础一之Activity
按下home键后再次启动:onRestart -> onStart -> onResume
Android基础一之Activity

2、从MainActivity启动SecondActivity:(MainActivity)onPause -> SecondActivity(onCreate -> onStart -> onResume) -> (MainActivity)onStop;
Android基础一之Activity
从SecondActivity返回MianActivity:(SecondActivity) onPause -> MainActivity(onRestart -> onStart -> onResume) -> SecondActivity(onStop -> onDestroy)
Android基础一之Activity

从上面可以看到从MainAcivity到SecondActivity或是从MainActivity按下home都是从onPause -> onStop的过程,有一种特殊情况,如果新Activity采用了透明主题,则不会回调当前Activity的onStop

3、调用startActivityForResult方法启动SecoundActivity:注意从SecondActivity返回MainActivity是先进入到onActivityResult方法中
Android基础一之Activity

除此之外,Activity生命周期还有以下特殊情况:
1、系统配置发生改变:
在默认情况下,如果没有对Activity做特殊处理,当系统配置发生改变后Activity会被销毁(如旋转屏幕),依次调用onPause,onStop,onDestroy,同时系统会调用onSaveInstanceState来保存当前Activity的状态。其中onSaveInstanceState是在onStop之前调用,和onPasuse没有既定的时间关系,且这个方法只有在Activity被异常终止的情况下回调。当Activity被重新创建后,系统会掉用onRestoreInstanceState,并把Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate,因此可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,其中onRestoreInstanceState方法在onStart之后被调用。
同时系统默认自动为我们做了一定的恢复工作。
2、系统资源不足导致低优先级Activity被杀死
Activity按优先级由高到低分三种:
1)前台Activity ——正在和用户交互的Activity,优先级最高;
2)可见但非前台Activity——比如弹对话框的Activity;
3)后台Activity——已被暂停的Activty,优先级最低。
当系统内存不足时,系统会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据

当然还有方式可以在系统配置发生改变后,Activity不会被重建,给Activity指定configChages属性,比如android:configChange=”orientation”,Activity在旋转屏幕时不重新创建。

Activity启动模式:
在Android系统中使用栈结构来保存这个APP的Activity,栈是一种后进先出的线性表;正常情况下每启动个Acitivity,都会push到任务栈中,新启动的Activity会置于任务栈的顶端,并处于活动状态,当按下back键或调用finish方法时,系统会移除顶部的Activity,让后面的Activity恢复活动状态,但这模式并不是唯一的,可以通过设置activity的launchMode或Intent的flag来改变:
launchMode有4个取值,对应4个启动模式:
1)standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已存在,谁启动了这个Activity,那么这个Activiy就运行在启动他的那个Acitivity所在的栈中。
2)singleTop:栈顶复用模式。如果新的Acitivity已经位于任务栈的顶端,则此Activity不会重新创建,同时它的onNewIntent方法会被调用。
3)singleTask:栈内复用模式。这是一种单例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Acitivty都不会重新创建实例,系统会回调起onNewIntent;当Acitivity以singleTask模式启动后,系统会首先寻找是否存在此Activity想要的任务栈,如果不存在,则重新创建一个任务栈,然后创建Activity的实例push到任务栈中;如果存在所需的任务栈,则看是否存在Activity的实例,如果存在就把Activity调到栈顶(clear上面的Activity)并调用onNewIntent,如果实例不存在,则创建Activity实例,并push到栈中。
4)singleInstance:单实例模式。这是一种加强的singleTask模式,除了具有singleTask模式的所有特性外,还加强了一点;具有此模式的Activity只能单独位于一个任务栈中。也就是说以该模式启动的Activity,系统会为它创建一个新的任务栈,此Activity独自在这个新的任务栈中,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个任务栈被系统销毁。