安卓学习笔记

学习安卓的学习笔记,留存一下,虽然以后可能都不会从事安卓相关的工作了,纪念一下。

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,因为他俩是一个栈

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值