<Android基础>(二) Activity Part 2
1.活动生命周期
1)返回栈
2)活动状态
3)活动的生存期
2.活动的启动模式
1)standard
2)singleTop
3)singleTask
4)singleInstance
3.活动的优化设计
1)设计知道当前的运行活动
2)随时随地退出程序
3)程序的启动优化
2.4 活动的生命周期
2.4.1 返回栈
Android系统使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈为先进后出的数据结构。
启动一个新活动,它再返回栈中入栈,并处于栈顶的位置。每当按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总会显示处于栈顶的活动给用户。
(图片来源于网络)
2.4.2 活动状态
1.运行状态:当一个活动处于栈顶时,这时活动就处于运行状态。
2.暂停状态:当一个活动不再处于栈顶,但仍然可见(比如对话框形式的活动只会占有部分区域),这时就进入了暂停状态。
3.停止状态:当一个活动不在处于栈顶,并且完全不可见的时候,就进入了停止状态。系统仍会为这种活动保存相应的状态和成员变量,但并不可靠。
4.销毁状态:当一个活动从返回栈中移除后就变成了销毁状态。
2.4.3 活动的生存期
1.Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
onCreate( )。在活动第一次被创建的时候调用。在该方法中完成活动的初始化操作。如:加载布局、绑定事件等。
onStart( )。在活动由不可见变为可见的时候调用。
onResume( )。在活动准备好和用户进行交互的时候调用。此时活动一定位于返回栈的栈顶,并且处于运行状态。
onPause( )。在系统准备去启动或恢复另一个活动时调用。
onStop( )。在活动完全看不见的时候调用。它和onPause( )方法的主要区别在于,如果启动一个对话框式的活动,onPause( )就会执行,而onStop( )不会执行。
onDestroy( )。在活动被销毁之前调用,之后活动的状态将变为销毁状态。
onRestart( )。在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
2.三种生存周期
完整生存期。
活动在onCreate( )和onDestroy( )方法之间所经历的就是完整生存期。
可见生存期。
活动在onStart( )和onStop( )方法之间所经历的就是可见生存期。
前台生存期。
活动在onResume( )和onPause( )方法之间所经历的就是前台生存期。
Android官方提供的活动生存周期图。
(图片来源于网络)
2.4.5 避免活动回收数据消失
当一个活动进入了停止状态,是有可能被系统回收的。
Activity中提供了onSaveInstanceState( )方法,保证在活动被回收之前一定会被调用。
onSaveInstanceState( )方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据。如:putString( )方法保存字符串,putInt( )方法用于保存整型数字……
每个保存方法传入两个参数,第一个参数是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。
(创建新活动MainActivity, NormalActivity, DialogActivity)
1.MainActvity重写方法onSaveInstanceState( )
2.修改MainActivity的onCreate( )方法
2.5 活动的启动模式
standard、singleTop、singleTask和singleInstance
通过在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
2.5.1 standard
standard是活动的默认启动方式,在不进行显示指定的情况下,所有活动都会自动使用该启动模式。在standard启动模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。
每次启动都会创建该活动的一个新的实例。有时活动已经在栈顶了,再次启动时还要创建一个新的活动实例。
2.5.2 singleTop
当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不用再创建新的活动实例。
Eg:
FirstActivity使用singleTop模式启动。
FirstActivity—>SecondActivity—>FirstActivity 仍会产生两个FirstActivity实例。
此时在FirstActivity按下Back键,返回SecondActivity,再按Back键返回第一个创建的FirstActivity,最后按下Back键才会退出。
2.5.3 singleTask
当活动模式指定为singleTask,每次启动该活动时系统首先会再返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有则创建新实例。
2.5.4 singleInstance
指定为singleInstance模式的活动会启用一个新的返回栈来管理活动。
假设程序中有一个活动是允许其他程序调用的,让其他程序和该程序可以共享这个活动的实例。在singleInstance模式下会有一个单独的返回栈来管理该活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈。
FirstActivity、SecondActitvity、ThirdActivity,其中SecondActivity使用singleInstance模式进行启动。
FirstActivity—>SecondActivity—>ThirdActivity
按下Back键进行返回,ThirdActivity直接返回了FirstActivity,再按下Back键返回SecondActivity,再按下Back键退出程序。FirstActivity和ThirdActivity在同一个返回栈,SecondActicity在单独的一个返回栈里。
2.6 活动的优化设计
2.6.1 设计知道当前是哪一个活动
新建一个Java类BaseActivity,让其继承AppCompatActivity类,在BaseActivity中重写onCreat( )方法。
在onCreat( )方法中获取了当前实例的类名,并通过Log打印了出来。
再次运行程序,就可以发现logcat中打印出了当前运行活动的名称。
2.6.2 随时随地退出程序
1.用一个专门的集合类对所有的活动进行管理。
设计一个类ActivityCollector,用List来暂存活动,提供addActivity()方法来向List中添加活动那个,removeActivity()方法来从List中移除活动,最后提供一个finishAll()方法来将List中的活动全部销毁掉。
2.修改BaseActivity中的代码
在onCreate()方法中调用了ActivityCollector的addActivity()方法,表明当前正在创建的活动增加到活动管理器里。在BaseActivity中重写onDestroy()方法,表明将一个马上销毁的活动从活动管理器中移除。
现在不论想在任何活动退出,只需要调用ActivityColletor.finishAll()方法即可。
Eg:
在ThirdActivity中的Button 3设置finishAll(),按下Button 3,即销毁所有活动。
加一句android.os.Process.killProcess(android.os.Process.myPid());可以杀掉当前进程的代码,以保证程序完全退出。
killProcess()方法只能用于杀掉当前程序的进程,不能用该方法去杀掉其他程序。
2.6.3 启动活动的最佳写法
假如SecondActivity中需要用到两个很重要的字符串参数,在启动SecondActivity的时候必须要传递过来。
1.常规写法:
2.优化写法
修改SecondActivity中的代码
在actionStart()方法中完成Intent的构建,所有需要的数据通过actionStart()方法的参数传递过来,然后存储在Intent中,最后调用startActivity()方法启动SecondActivity。
在FirstActivity中修改代码:
SecondActivity所需要的数据在方法参数中全部体现出来了,只需要一行代码即可启动SecondActivity。