Activity16问

1. 横竖屏切换时Activity生命周期

进行测试:
1.1 运行Activity,得到如下信息

onCreate-->
onStart-->
onResume-->

1.2 按crtl+f12切换成横屏时

onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

1.3 再按crtl+f12切换成竖屏时,发现又打印了相同的log

onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

1.4 再按crtl+f12切换成竖屏时,发现又打印了相同的log

onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

1.5 修改AndroidManifest.xml
把该Activity添加
android:configChanges=“orientation”,
执行步骤3(切换成横屏时)

onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

1.6 再执行步骤4(切换竖屏),发现再打印相同信息

onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

1.7 修改AndroidManifest.xml
把该Activity添加 android:configChanges=“orientation|screenSize”,
执行步骤3(切换成横屏时)

onConfigChanged-->

1.8 执行步骤4(切换成竖屏幕)

onConfigurationChanged-->

只打印onConfigChanged

1.9 修改AndroidManifest.xml
把android:configChanges="orientation|screenSize"改成android:configChanges=“orientation|keyboardHidden|screenSize”
执行步骤3(切换横屏幕)
只打印
onConfigChanged

执行步骤4(切换竖屏幕)
只打印onConfigChanged
切记一定要加上后边的screenSize否则在4.0以上版本生命周期执行不生效。

总结:
1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行1次,切竖屏时会执行1次
2.设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3.设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
4.设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏切记要加上screenSize,否则4.0版本以上生命周期不生效
4.补充
当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖是一样的):
onPause --> onStop onRestart -->onStart—>onResume
Activity未被完全覆盖只是失去焦点:onPause—>onResume

2.不同场景下 Activity 生命周期的变化过程

在这里插入图片描述
在这里插入图片描述

3.如何处理异常退出

您可通过使用 ViewModel 对象来减轻重新初始化 Activity 的负担。系统会在配置变更时保留 ViewModel,使其成为保存界面数据的理想场所,让您无需再次查询这些数据。

在这里插入图片描述
在这里插入图片描述
搞懂这个生命周期的执行后就可以回答了,首先要知道面试官的意思:是要重新启动并恢复这个 Activity 还是说直接退出整个 app
如果要恢复则要在 onSaveInstanceState() 中进行保存数据并在 onRestoreInstanceState() 中进行恢复
如果是要退出 app 的话就要捕获全局的异常信息,并退出 app
当然个人建议是使用 UncaughtExceotionHandler 来捕获全局异常进行退出 app 的操作,这样会减少之前崩溃所造成的后遗症!

4.什么是 onNewIntent

在这里插入图片描述
如果 IntentActivity 处于任务栈的顶端,也就是说之前打开过的 Activity ,现在处于 onPause 、 onStop 状态的话,其他应用再发送 Intent 的话

执行顺序为:onNewIntent,onRestart,onStart,onResume。

在该Activity的实例已经存在于Task和Back stack中(或者通俗的说可以通过按返回键返回到该Activity )时,当使用intent来再次启动该Activity的时候,如果此次启动不创建该Activity的新实例,则系统会调用原有实例的onNewIntent()方法来处理此intent.

且在下面情况下系统不会创建该Activity的新实例:

1,如果该Activity在Manifest中的android:launchMode定义为singleTask或者singleInstance.

2,如果该Activity在Manifest中的android:launchMode定义为singleTop且该实例位于Back stack的栈顶.

3,如果该Activity在Manifest中的android:launchMode定义为singleTop,且上述intent包含Intent.FLAG_ACTIVITY_CLEAR_TOP标志.

4,如果上述intent中包含 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志和且包含 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志.

5,如果上述intent中包含 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志且该实例位于Back stack的栈顶.

5.启动模式的使用方式

在这里插入图片描述
优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以另外一种方式为准。

限定范围:第一种方式无法为 Activity 直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,另外一种方式无法为 Activity 指定 singleInstance 模式。

6.启动模式的实际应用场景

在这里插入图片描述

7.快速启动一个 Activity

在这里插入图片描述
这个问题其实也是比较简单的,就是不要在 Activity 的 onCreate 方法中执行过多繁重的操作,并且在 onPasue 方法中同样不能做过多的耗时操作。

Activity 的 Flags
在这里插入图片描述

8.内存不足时系统会杀掉后台的Activity,若需要进行一些临时状态的保存,在哪个方法进行

在这里插入图片描述

9.onSaveInstanceState() 被执行的场景

系统不知道你按下 HOME 后要运行多少其他的程序,自然也不知道 activity A 是否会被销毁
因此系统都会调用 onSaveInstanceState() ,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则:
1.当用户按下 HOME 键时
2.长按 HOME 键,选择运行其他的程序时
3.锁屏时
4.从 activity A 中启动一个新的 activity 时
5.屏幕方向切换时

10.两个 Activity 之间跳转时必然会执行的方法

在这里插入图片描述

当在 A 里面激活 B 组件的时候, A 会调用 onPause() 方法,然后 B 调用 onCreate() , onStart() , onResume() 。

这个时候 B 覆盖了窗体, A 会调用 onStop() 方法. 如果 B 是个透明的,或者 是对话框的样式, 就不会调用 A 的 onStop() 方法。

11.scheme 跳转协议

在这里插入图片描述

12.Context 是什么

它描述的是一个应用程序环境的信息,即上下文。
通过它我们可以获取应用程序的资源和类, 也包括一些应用级别操作, 例如:启动一个 Activity ,发送广播,接受 Intent ,信息,等。

13.Activity 的管理机制

在这里插入图片描述

14.什么是 Activity

在这里插入图片描述
activity 是 Context 的子类,同时实现了 window.callback 和 keyevent.callback ,可以处理与窗体用户交互的事件。
开发中常用的有 FragmentActivity 、ListActivity

15.什么是 ANR,如何避免

在这里插入图片描述

16.Android不同组件ANR超时时间不同

在这里插入图片描述

16.关于taskAffinity

单纯使用 taskAffinity 不能导致 Activity 被创建在新的任务栈中,需要配合 singleTask 或者 singleInstance!

taskAffinity + allowTaskReparenting
allowTaskReparenting 赋予 Activity 在各个 Task 中间转移的特性。一个在后台任务栈中的 Activity A,当有其他任务进入前台,并且 taskAffinity 与 A 相同,则会自动将 A 添加到当前启动的任务栈中。

举一个生活中的场景:
1.在某外卖 App 中下好订单后,跳转到支付宝进行支付。当在支付宝中支付成功之后,页面停留在支付宝支付成功页面。
2.按 Home 键,在主页面重新打开支付宝,页面上显示的并不是支付宝主页面,而是之前的支付成功页面。
3.再次进入外卖 App,可以发现支付宝成功页面已经消失。

分别创建 2 个 Android 工程:First 和 TaskAffinityReparent:
2.在 First 中有 3 个 Activity:FirstA、FirstB、FirstC。打开顺序依次是 FirstA -> FirstB -> FirstC。其中 FirstC 的 taskAffinity 为”lagou.affinity“,且 allowTaskReparenting 属性设置为true。FirstA 和 FirstB 为默认值;
2.TaskAffinityReparent 中只有一个 Activity–ReparentActivity,并且其 TaskAffinity 也等于”lagou.affinity“。

将这两个项目分别安装到手机上之后,打开 First App,并从 FirstA 开始跳转到 FirstB,再进入 FirstC 页面。然后按 Home 键,使其进入后台任务。此时系统中的 Activity 信息如下:
在这里插入图片描述
接下来,打开 TaskAffinityReparent 项目,屏幕上本应显示 ReparentActivity 的页面内容,但是实际上显示的却是 FirstC 中的页面内容,并且系统中 Activity 信息如下:
在这里插入图片描述
可以看出,FirstC 被移动到与 ReparentActivity 处在一个任务栈中。此时 FirstC 位于栈顶位置,再次点击返回键,才会显示 ReparentActivity 页面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的代码家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值