学习安卓的学习笔记,留存一下,虽然以后可能都不会从事安卓相关的工作了,纪念一下。
1 Activity
1 返回栈
活动可以层叠,启动一个新的活动会覆盖在原活动上,Back会销毁最上面的活动,下面的一个活动就会重新显示。
用任务管理一系列活动。任务用返回栈描述。
启动一个新的活动,这个活动就在返回栈中入栈,finish()即栈顶元素出栈,系统总是会显示处于栈顶的活动给用户。(所以finish()销毁的是栈顶,现在活动的会执行到finish()的也只有栈顶活动)
2 生命周期
2.1 活动的4种状态
1 运行状态
处于栈顶的活动,系统不愿意回收这种
2 暂停状态
活动不处于栈顶,但是依然可见,虽然不处于栈顶,但是完全存活着的,系统也不愿意回收,除非,内存很低。
3 停止状态
活动不处于栈顶,且完全不可见。
系统仍会为这种活动保存相应的状态和成员变量,但是不可靠,可能会被回收,看内存情况。
4 销毁状态
从返回栈中移除。
系统倾向于回收处于这种状态的活动。
2.2 活动的生命周期
2.2.1 7个回调函数
1 OnCreate()
在活动第一次被创建时候调用
可以在这里完成一些初始化动作。
2 onStart()
在活动由不可见变为可见时候调用。
3 onResume()
在活动准备好和用户进行交互的时候调用。
此时活动一定位于栈顶,处于运行状态。
4 onPause()
系统准备去启动或者恢复另一个活动时候调用。
可以用来释放资源、保存关键数据。
5 onStop()
在活动完全不可见时候调用。
和onPause()区别是,如果启动的新活动是一个对话框式的活动(也就是之前的活动不会不可见),那么onPause()会得到执行。
6 onDestroy()
在活动被销毁之前调用,之后活动状态将变为销毁状态。
(即活动出栈)
7 onRestart()
在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
2.2.2 3种生存期
- 完整生存期
onCreate()~onDestroy()
- 可见生存期
onStart()~onStop()
可见不等于可与用户交互。
- 前台生存期
onResume()~onPause()
前台生存期内,活动处于运行状态,可以和用户进行交互。
测试:
和书上不一样的是对话框主题要设置成这样,不然点击就崩溃:
<activity android:name=".DialogActivity"
android:theme = "@style/Theme.AppCompat.Dialog"></activity> <!--配置成对话框式->
MainActivity第一次被创建时,一次执行OnCreate() onStart() onResume()
点击按钮,启动NormalActivity时候,MainActivity会被完全遮挡住,因此onPause()和onStop()被调用。
按下Back返回MainActivity,之前MainActivity已经进入了停止状态,所以onRestart()方法执行,之后依次执行onStart()和onResume()
恢复执行-->不可见到可见-->交互
启动DialogActivity,onPause()执行,关闭DialogActivity,onResume()执行,因为MainActivity没有停止,也没有不可见。
最后在MainActivity按下Back,依次执行:
2.2.3 Bundle
如果B返回到A,A在B运行期间被系统回收,那么会执行A的onCreate()方法,如果A中存在临时数据和状态也被回收了,用户体验很不好。
解决:onSaveInstanceState()回调方法,保证在活动回收之前一定被调用,??干嘛不重载下onDestroy啊?
/ / 在 回 收 前 ⼀ 定 被 调 ⽤ , 可 以 在 B u n d l e 中 保 存 数 据
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("tempData","hengheng");
}
在onCreate()里恢复
//恢复在上次回收前在Bundle中保存的数据
if(savedInstanceState !=null) {
Log.d(TAG,savedInstanceState.getString("tempData"));
}
Bundle也可结合Intent一起传递数据。
2.3 活动的启动模式
如图四种,在AndroidMainfest.xml的activity属性里修改android:launchMode
2.3.1 standard
standard 是活动默认的启动模式。
standard模式下,每当启动一个新的活动,就会创建该活动一个新的实例,并入栈,不管它是否已在返回栈中存在。
比如点击某个按钮启动一个activity,点击n次就会启动n个,back回去要back n次。
2.3.2 singleTop
启动活动时,如果该活动在栈顶就直接使用,否则创建新的实例。
比如从MainActivity到SecondActivity,此时栈顶是SecondActivity,再从SecondActivity启动MainActivity,这时因为栈顶不是MainActivity,会新建一个MainActivity实例,打印这两个实例会看到不一样。
2.3.3 singleTask
启动活动时,会在栈中检查有没有,有就使用,当然在他之上的活动都会全部出栈。
如果singleTask指定了不同的taskAffinity,也会启动一个新的返回栈。
2.3.4 singleInstance
First、Second、Third三个不同的Activity
把SecondActivity改成singleInstance,则启动SecondActivity会把它加入一个新的返回栈,
Log.d("SecondActivity","Task id is"+getTaskId());
打印三个Activity的TaskId(所属栈id)会发现,First和Third是相同的,Second是不同的,如果First启动Second,Second中启动Third,从Third Back会回到First而不是Second,因为他俩是一个栈