安卓面试题——四大组件之Activity

一.介绍一下Activity的生命周期
在这里插入图片描述
Activity的生命周期如下
onCreate——onStart——onResume——onPause——onRestart——onStop——onDestroy

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity

问1.onStart()和onResume()/onPause()和onStop()的区别?
判断app是否位于前台,对用户是否可见的区别
问2. A跳B的生命周期(B不透明)
A:onPause B:onCreate-onStart-onResume A:onStop
问3. B跳回A
B:onPause A:onRestart-onStart-onResume B:onStop-onDestroy
问4. A跳B的生命周期(B透明)
A:onPause B:onCreate-onStart-onResume
问5.1 App按Home键的执行顺序
onPause->onStop
问5.2 App从后台回到前台
onRestart->onStart->onResume
问6.1 异常情况下的生命周期,例如屏幕旋转
在这里插入图片描述
1.默认情况下Activity会被销毁,其onPause、onStop、onDestory均会被调用,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,他和onPause没有既定的时序关系。
2.当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。
3.系统只再Activity异常终止地时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据
问6.2 资源内存不足导致低优先级地Activity被杀死
1.前台Activity——正在和用户交互的Activity,优先级最高。
2.可见前台但非前台Activity——比如Activity弹出了一个对话框,导致Activity可见,但是位于后台无法和用户直接交互。
3.后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。
解释:系统只再Activity异常终止地时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据
问7.我不想系统重新创建Activity
xml文件给activity设置configChanges属性
configChanges的属性有很多大家可自行边度

android:configChanges="orientation"

onPause不要做太耗时的工作

二.Activity分为几种启动模式?

Activity的启动模式分为四种
standard、singleTop、singTask、singleInstance

standard(标准模式):
Activity的默认启动模式,每当启动一个新的Activity,它就会进入任务栈,并处于栈顶的位置

singleTop(栈顶复用模式):
启动时会判断Activity是否在任务的栈顶,如果在任务的栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),否则就会创建新的实并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例

singleTask(栈内复用模式):
启动时会判断Activity是否在任务的栈内,如果在任务的栈内正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),并且把该Activity实例上面的Activity实例全部出栈,让该Activity实例位于栈顶;如果栈内不存在该Activity的实例,则在栈顶创建一个新的实例

singleInstance(单实例模式):
这是一种加强了的singleTask模式,除了拥有singTask的所以特性之外,该模式的Activity还会启动一个新的任务栈来管理Activity实例,并且该实例在整个系统中只有一个。无论从那个任务栈中 启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity实例。
问1.activity在singleTop模式下的生命周期
1.Activity1,Activity2,Activity3
我们在配置文件中将三个act都可以设置为singleTop
在这里插入图片描述
2.Activity1->Activity1-Activity1
在这里插入图片描述
3.跳转相同的页面,它调用了onNewIntent而不再是onCreate->onStart->onResume->前onStop(当然在内存不够的时候销毁了之前相同的Activity依然会走onCreate方法)。
4.当前singleTop模式的act正处于栈顶时,跳转该Activity会调用onNewintent方法且不会重新创建该act实例,只会重新调用该实例,生命周期为:onPause->onNewIntent->onResume
问2.activity在SingleTask模式下的生命周期
1.设计三个act_task1,act_task2,act_task3
act_task1->act_task2->act_task3
在这里插入图片描述
2.再回跳转到act_task1
在这里插入图片描述
3.系统会先从内部开始把act_task1与act_task3之间的act全部结束noDestroy。然后暂停act_task3,调用act1的onNewIntent->onRestart->onStart->onResume然后再停止并结束act3。
总结:
一、
SingleTask与SingleTop生命周期相同的时候是在当前act正处于栈顶且跳转的是该act。
但是在里面的时候,由于处于非栈顶的act都被完全覆盖了,所以生命周期会不仅仅运行onPause还会到onStop,所以在重新启用时,会先调用onRestart,再执行以下顺序:onStart->onResume。
二、
跳转singleTask模式的act,需要先结束栈内除跳转的act外的act,然后再暂停当前act,接着重启act,最后结束之前暂停的act。
问题一二出自CSDN博主「程序的灵魂终结者」的原创文章
原文链接:

https://blog.csdn.net/qq_33505655/article/details/80250255

三.给Activity指定启动模式
(一)可在AndroidManifest.xml中,通过标签的android:launchMode属性设置:

android:launchMode="standard"
android:launchMode="singleTop"
android:launchMode="singleTask"
android:launchMode="singleInstance"

(二)也可在Intent中设置标志位韦Activity指定启动模式:

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//指定singleTask模式,与在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同
 
Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
//指定singleTop模式,与在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同
 
Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//具有这个标志的Activity启动时,在同一个任务栈中所以位于它上面的Activity都要出栈,一般会和singleTask模式一起出现
 
Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
//具有这个标志的Activity不会出现在历史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值