一、activity简介
activity作为android四大组件中最基础最常用的组件,它主要负责与用户交互,一般一个activity就是一个页面(用户看到的屏幕上的页面)。
二、activity状态
activity 有四种状态:Active/Running Paused Stopped Killed
Active/Running(活跃/运行):activity被启动之后,处于栈顶,也就是被激活,可以与用户进行正常的交互。
Paused(已暂停):当activity失去焦点,比如说此时正在进行网络请求等耗时操作,网络请求的进度条正在展示,再比如说点击了页面上的一个按钮,此时页面上弹出一个PopupWindow或者Dialog.此时activity就是处于Paused.但此时activity与窗口管理器(WindowsManage)保持联络,但是当手机系统内存极低的时候,activity就会被强行的终止掉。
Stopped(已停止):当当前activity被完全覆盖,不可见,就是停止状态。但当前activity依然存活,当系统内存不够用,需要的时候,当前activity会被强行终止。
Killed(已销毁):当activity处于Paused或者是Stopped这两个状态的时候,activity就可以被销毁。
关于activity的状态其实是根据用户的操作相互转换的,如下图2-01:
三、activity的生命周期
首先还是先来一张经典的生命周期图2-02:
ps:
灰色矩形方框内都是activity的生命周期方法
有颜色的圆框里是activity的状态
圆角框斜体文字是说明
生命周期方法情形调用说明:
情形1.当前activity被启动:执行onCreate(),onStart(),onResume(),之后activity展现在用户页面上,处于运行状态(Running)
情形2.当前activity显示dialog或者被透明的activity覆盖(依然部分可见)或锁屏:执行onPause(),处于暂停状态(Paused)
情形3.当前activity中关闭dialog回到当前activity或解锁屏:执行onReseme(),回到运行状态(Running)
情形4.当前activity被另一个activity完全覆盖或者是点击Home键:执行onPause(),onStop(),处于停止状态(Stopped)
情形5.从其他的activity回退(是回退)到当前activity:执行onRestart(),onstart(),onResume(),回到运行状态(Running)
情形6.如果发生了情形2,或者是情形4,activity处于暂停或者是停止状态,如果遇到系统内存严重不足,系统就是强制回收activity,那么再回到activity的话就会执行:onCreate(),onStart(),onReseme(),处于运行状态(Running)
情形7.用户退出activity,就是用户点击返回键或者是代码中调用finish()方法,执行:onPause(),onStop(),onDestroy(),activity销毁。
日常开发中常用的生命周期方法:
onCreate():做一些初始化UI的操作。
onResume():比如说进入页面就需要网络请求数据填充UI并且从上一个页面(activity)要返回到当前页面也需要刷新页面(再次进行网络请求时)那么就直接把网络请求写在onResume()方法中。
onDestroy(): 一些资源的回收,需要在此方法中进行,以免造成不必要的内存泄露。
生命周期方法是开发中最常用的最基础的东西,一定要自己动手打印,眼过千遍不如手过一遍。
四、activity的启动模式
activity的启动模式与自身的生命周期方法息息相关,activity的启动模式不同,生命周期方法也不同。
任务栈的概念
我们知道当我们启动一个应用的时候,系统会默认给当前应用开启一个应用栈,或者叫任务栈,里面存放根activity,
那么正常情况下,根activity会在任务栈的最底端,然后再启动一个新的activity,新的activity会处在栈的最顶端,如图2-03所示:
了解了任务栈的概念,接下来进入正题,activity的启动模式
activity的启动模式有四种:
standard:标准模式,也是activity默认的启动模式,新启动的activity 处于栈顶启动如图2-04:
SingleTop:栈顶复用模式,在该模式下,如果我们要启动的activity处于任务栈的栈顶,那么activity就不会被重复创建,下图中Aactivity的启动模式为SingleTop 如图2-05:
SingleTask:栈内复用模式,该模式与SingleTop相似,SingleTop只是针对栈顶的元素,SingleTask针对栈内所有元素,下图中我们给A activity启动模式设置为SingleTask,效果如图2-06:
SingleInstance:全局唯一模式,这种启动模式比较特殊,在该模式下,我们会为新的activity单独创建一个任务栈,来存放此activity,并使其获取焦点,新的任务栈 有且只有这一个activity的实例。如果已经创建过目标activity的实例,则比较创建新的task,而是将之前创建的activity唤醒(task的状态切换为Foreground).如下图,A activity 启动模式设置为SingleInstance,效果如图2-07:
启动模式的使用场景:
standard:标准模式是平时使用最多的,默认就是这个模式,就不多说了;
SingleTop:栈顶复用模式,个人碰到的场景就是,比如说点击按钮跳转到另一个activity,这个按钮又没有做防重复点击的处理,那么 这个时候快速的点击按钮,就会跳转很多个activity(创建多个activity的实例),这个时候就可以把目标activity设置为SingleTop.问题解决。
SingleTask:适用于返回主页面的activity,其中的道理就不多解释了。
未完待续。。。