目录
1.4 重写onCreate方法,并在该方法中加载布局first_layout
1.5 创建布局first_layout.xml,在该布局中添加一个Button控件
1.6 在onCreate方法中获得布局中Button的引用
1.8 重写onDestroy方法,并在该方法中用Log.d打印该Activity退出的信息:Activity名称+“退出了,bye!”
2.1 创建SecondActivity和ThirdActivity,SecondActivity1加载布局second_layout,ThirdActivity加载布局third_layout。
(1)在first_layout.xml中添加两个按钮(Button1, Button2)
(2)点击Button1显示intent启动SecondActivity
(3)点击Button2时使用隐式Intent启动ThirdActivity
2.3 此外从FirstActivity中传递一个字符串”Hello SecondActivity”到SecondActivity中,并在SecondActivity中用TextView控件显示。
(2)在SecondActivity中用TextView控件显示
三、创建2个Activity: NormalActivity和DialogActivity,对应的两个layout命名为normal_layout和dialog_layout。
3.1 NormalActivity是普通的Activity
3.2 DialogActivity的主题为 android:theme="@style/Theme.AppCompat.Dialog
3.3 在FirstActivity中添加2个按钮,通过点击这两个按钮启动NormalActivity和DialogActivity
(1)在first_layout.xml中添加btn4和btn5两个按钮
(2)在FirstActivity写入btn4和btn5两个按钮的点击事件
3.4 重写这三个Activity的生命周期7个回调方法。在回调方法中打印Activity所在的类名称和回调方法名称
4.1 运行程序,FirstActivity达到了可见状态,即到达resumed状态
4.4 点击返回,Normalactivity销毁,Firstactivity可见
(1)onCreate()方法中适合编写什么功能的代码?为什么?
(2)通常应该在onPause()回调方法里面做什么操作?为什么?
(3)通常应该onStop()回调方法里面做什么操作?为什么?
(5)一个Activity从Stop状态到可以跟用户交互顺序调用了哪些回调方法?
(5) 反复点击之后的控制台打印信息,可以看到没有触发销毁,即每一次都是触发一次新的Activity
5.2 设置FirstActivity的启动模式为standard。查看运行和退出效果
(1)修改FirstActivity的启动模式为standard
5.3 设置FirstActivity的启动模式为singleTask。查看运行和退出效果
(1)修改FirstActivity的启动模式为singleTask
5.4 设置FirstActivity的启动模式为singleInstance。查看运行和退出效果
(1)修改FirstActivity的启动模式为singleInstance
(2)可以看到FirstActivity在启动的时候创建,点击到SecondActivity之后被创建,之后再点击都没效果了。
1. 解析singleTask和singleTop启动模式的区别
2. 解析singleTask和singleInstance启动模式的区别
一、启动与销毁Activity
1.1 首先创建一个工程ActivityTest
图1 创建Activity工程
1.2 创建一个名为FirstActivity的活动
图2 创建FirstActivity活动
1.3 在Manifest.Xml文件中注册该活动
图3 在AndroidManifest.xml注册FirstActivity活动
1.4 重写onCreate方法,并在该方法中加载布局first_layout
图4 在FirstActivity.kt文件重写onCreate方法
1.5 创建布局first_layout.xml,在该布局中添加一个Button控件
图5 first_layout.xml中的代码
1.6 在onCreate方法中获得布局中Button的引用
图6 FirstActivity.kt文件中的代码
1.7 运行结果
图7 运行截图
1.8 重写onDestroy方法,并在该方法中用Log.d打印该Activity退出的信息:Activity名称+“退出了,bye!”
图8 在FirstActivity.kt文件重写onDestory方法
Logcat打印截图如下:
图9 Logcat打印结果
二、启动Activity
2.1 创建SecondActivity和ThirdActivity,SecondActivity1加载布局second_layout,ThirdActivity加载布局third_layout。
图10 SecondActivity.kt文件
图11 ThirdActivity.kt文件
2.2 在上题的FirstActivity的布局中添加两个按钮(Button1, Button2),点击Button1时使用显式Intent启动SecondActivity,点击Button2时使用隐式Intent启动ThirdActivity
(1)在first_layout.xml中添加两个按钮(Button1, Button2)
图12 first_layout.xml文件
布局如下:
图13 FirstActivity布局页面
(2)点击Button1显示intent启动SecondActivity
① 在FirstActivity的onCreate()方法中写入如下代码
图14 FirstActivity.lt文件
② 点击Button1运行截图如下:
图15 点击Button1的运行结果
(3)点击Button2时使用隐式Intent启动ThirdActivity
① 在FirstActivity的onCreate()方法中写入如下代码
图16 FirstActivity.lt文件
②在AndroidManifest.xml中注册ThirdActivity
图17 AndroidManifest.xml注册ThirdActivity
③ 点击Button2运行截图如下:
图18 点击Button2的运行截图
2.3 此外从FirstActivity中传递一个字符串”Hello SecondActivity”到SecondActivity中,并在SecondActivity中用TextView控件显示。
(1)在FirstActivity的button1按钮的点击事件添加如下代码
图19 FirstActivity.kt文件
(2)在SecondActivity中用TextView控件显示
图19 SecondActivity.kt文件
(3)点击Button1运行截图
图20 点击Button1的运行结果
三、创建2个Activity: NormalActivity和DialogActivity,对应的两个layout命名为normal_layout和dialog_layout。
3.1 NormalActivity是普通的Activity
(1) NormalActivity
图21 NormalActivity.kt文件
(2)normal_layout.xml
图22 normal_layout.xml文件
3.2 DialogActivity的主题为 android:theme="@style/Theme.AppCompat.Dialog
(1) DialogActivity
图23 DialogActivity.kt文件
(2)在AndroidManifest.xml加入主题
图24 AndroidManifest.xml文件
3.3 在FirstActivity中添加2个按钮,通过点击这两个按钮启动NormalActivity和DialogActivity
(1)在first_layout.xml中添加btn4和btn5两个按钮
图25 first_layout.xml文件
布局截图如下:
图26 FirstActivity布局页面
(2)在FirstActivity写入btn4和btn5两个按钮的点击事件
图27 FirstActivity.kt文件
(3)运行截图
图28 点击reach NormalActivity按钮运行截图
图29 点击reach DialogActivity按钮运行截图
3.4 重写这三个Activity的生命周期7个回调方法。在回调方法中打印Activity所在的类名称和回调方法名称
(1)FirstActivity
图30 重写FirstActivity的生命周期回调方法
图31 重写FirstActivity的生命周期回调方法
图32 重写FirstActivity的生命周期回调方法
(2)NormalActivity
图32 重写NormalActivity的生命周期回调方法
图33 重写NormalActivity的生命周期回调方法
图34 重写NormalActivity的生命周期回调方法
(3)DialogActivity
图35 重写DialogActivity的生命周期回调方法
图36 重写DialogActivity的生命周期回调方法
图37 重写DialogActivity的生命周期回调方法
四、运行程序,查看logcat的输出
4.1 运行程序,FirstActivity达到了可见状态,即到达resumed状态
图40 Logcat输出截图
4.2 点击 reach NormalActivity按钮
图41 Logcat输出截图
4.3 可以看到这个时候FirstActivity已经hidden了,是不可见的状态
图42 Logcat输出截图
图43 Logcat输出截图
4.4 点击返回,Normalactivity销毁,Firstactivity可见
图44 Logcat输出截图
图45 Logcat输出截图
图46 Logcat输出截图
4.5 点击reach DialogActivity按钮,可以看到这个时候FirstActivity没有hidden,只是暂停,部分可见
图47 Logcat输出截图
图48 Logcat输出截图
4.6 问题解答
(1)onCreate()方法中适合编写什么功能的代码?为什么?
这个方法里面适合来绑定视图,加载数据。
因为这个方法会初始化setContentLayout()方法(屏幕绘制),是Activity生命周期中最先触发的方法。
(2)通常应该在onPause()回调方法里面做什么操作?为什么?
我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
因为这个方法在系统准备去启动或者恢复另一个活动的时候调用。
(3)通常应该onStop()回调方法里面做什么操作?为什么?
应该释放所有不再需要的资源。一旦某个Activity停止了,系统会在不需要这个Activity时摧毁它的实例。在极端情况下,系统会直接杀死app进程,并且不执行Activity的onDestroy()回调方法, 因此需要使用onStop()来释放资源,从而避免内存泄漏。
因为当Activity调用onStop()方法时,这个Activity再也不可见,尽管onPause()方法是在onStop()之前调用,还是应该使用onStop()来执行那些CPU intensive的shut-down操作。
(4)什么情况下Activity会部分可见?请举个例子。
Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity可能是透明或未完全遮挡),即如果覆盖的另外一个Acitivity是透明或者只有部分的话,还是可以看得到之前的Activity。
(5)一个Activity从Stop状态到可以跟用户交互顺序调用了哪些回调方法?
onRestart()- > onStart() -> onResume()
五、启动模式
5.1 编写一个FirstActivity,并在FirstActivity中通过点击按钮启动SecondActivity,然后在SecondActivity中通过点击按钮再次启动FirstActivity。重写这两个Activity的onCreate和onDestory方法,打印简单的调试信息,方便查看他们的启动和销毁。
(1) FirstActivity
图49 FirstActivity.kt文件
图50 FirstActivity.kt文件
(2) first_layout
图51 first_layout.xml文件
(3) SecondActivity
图52 SecondActivity.kt文件
(4) second_layout
图53 second_layout.xml文件
(5) 反复点击之后的控制台打印信息,可以看到没有触发销毁,即每一次都是触发一次新的Activity
图54 Logcat输出截图
一直点击返回之后的控制台打印信息,可以看到每个都是新的Activity
图55 Logcat输出截图
5.2 设置FirstActivity的启动模式为standard。查看运行和退出效果
(1)修改FirstActivity的启动模式为standard
图56 AndroidManifest.xml文件
(2)可以看到默认的启动模式就是standard,结果同1
图57 Logcat输出截图
(3)一直点返回的运行截图
图58 Logcat输出截图
5.3 设置FirstActivity的启动模式为singleTask。查看运行和退出效果
(1)修改FirstActivity的启动模式为singleTask
图59 AndroidManifest.xml文件
(2)当从secondActivity回到firstActivity的时候,由于栈里面已经有firstActivity,所以把栈顶的secondActivity出栈,并且重用栈里面的firstActivity
图60 Logcat输出截图
5.4 设置FirstActivity的启动模式为singleInstance。查看运行和退出效果
(1)修改FirstActivity的启动模式为singleInstance
图61 AndroidManifest.xml文件
(2)可以看到FirstActivity在启动的时候创建,点击到SecondActivity之后被创建,之后再点击都没效果了。
图62 Logcat输出截图
5.5 问题思考
1. 解析singleTask和singleTop启动模式的区别
(1)singleTop模式:要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。(注意是栈顶,不在栈顶照样创建新实例!)
(2)singleTask模式:当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
2. 解析singleTask和singleInstance启动模式的区别
singleTask不会产生新的栈, 而singleInstance第一次调用的时候则会产生新的栈, 在singleTask模式下,如果原来的栈里已经存在要调用的Activity的实例,下次调用的时候会销毁中间所有的Activity。而singleinstance单独在一个栈就不会影响别的Activity。