Android面试——Activity

作为Android四大组件之一,该组件为用户提供了一个屏幕,用户在这个屏幕上进行操作来完成一定的功能,也可以理解为是一个界面, Android系统中通过活动栈(后进先出)来对Activity进行管理,而Activity自身则通过其自己的生命周期来使自己被创建与销毁

生命周期

onCreate() : 在Activity创建时调用,通常做一些初始化设置
onStart(): 在Activity即将可见时调用,Activity已经显示,但是不能和用户进行交互
onResume(): 在Activity已可见,获取焦点开始与用户交互时调用
onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用,可以理解为该界面被部分遮盖
onStop() : 在Activity对用户不可见时调用,可以理解为该界面被全部遮盖。此时的Activity不可见,但是没有被完全销毁,仍在后台中运行。
onDestroy() :在Activity销毁时调用,可以在此方法中做一些回收工作和终的资源释放。
onRestart() : 在Activity从停止状态再次启动时调用,从一个界面返回到此界面

生命周期实战(A页面   B页面)

A页面Home按键A页面

onCreate→onStart→onResumeonPause→onStoponRestart→onStart→onResume

A页面B页面(若B是透明样式或主题为Dialog,A不走onStop)

onPause→onCreate→onStart→onResumeonStop

B页面backA页面(若B是透明样式或主题为Dialog,A不走onRestart和onStart)

onPauseonRestart→onStart→onResume→onStop→onDestroy

横竖屏生命周期 

横竖屏切换涉及到的是Activity的android:configChanges属性,可以设置的属性值有:

1. orientation:消除横竖屏的影响

2. keyboardHidden:消除键盘的影响

3. screenSize:消除屏幕大小的影响

未设置android:configChanges属性时进行横竖屏切换

onCreate→onStart→onResume→切换横屏

onPause→onSaveInstanceState→onStop→onDestroy→onCreate→onStart→onRestoreInstanceState→onResume

设置Activity的android:configChanges属性为orientation或者orientation|keyboardHidden或者不设置这个属性的时候,横竖屏切换会重新调用各个生命周期方法,切横屏时会执行1次,切竖屏时会执行1次;
设置Activity的属性为android:configChanges="orientation|keyboardHidden|screenSize"时,横竖屏切换不会重新调用各个生命周期方法,只会执行onConfigurationChanged方法;

启动模式

android:launchMode

Standard 标准模式

无论任务栈内是否已经存在要启动的Activity实列,都会创建一个Activity放入任务栈,并置于栈顶。

SingleTop 栈顶复用模式

如果新的activity已经位于任务栈的栈顶,那么此activity不会重新创建实例,而是复用栈顶activity即onCreate、onStart不会回调,同时会onNewIntent方法回调。如果activity的实例已经存在栈内,不是位于栈顶,还是会重新创建activity实例。

SingleTask 栈内复用模式

如果栈内已经存在要启动的Activity实例,就把该Activity栈上面的activity清出栈,让该activity置于栈顶,onNewIntent方法会被回调,但是onCreate、onStart方法不会执行
使用场景:APP的首页

SingleInstance 单实例模式

Activity实例单独占用一个任务栈,也就是启动该模式的Activity同时给它分配一个任务栈。
使用场景:singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题

任务栈

TaskAffinity 

1、在manifest文件的activity标签下指定。
2、这个属性主要与SingleTask启动模式或者allowTaskReparenting属性配对使用其他情况下没有意义。

taskAffinity 与 singleTask 配对使用:如果待启动的activity设置了这两个属性 ,这个 Activity就会在 taskAffinity设置的任务栈中。
taskAffinity 与 allowTaskReparenting 配对使用:当一个应用 A 启动了应用 B 的某个 Activity 后,如果这个 Activity 的 allowTaskReparenting 属性为 true 的话,那么当应用 B 被启动后,此 Activity 会直接从应用 A 的任务栈转移到应用 B 的任务栈中。这个属性主要作用就是将这个 Activity 转移到它所属的任务栈中。

3、默认情况下TaskAffinity属性值为包名。即sigleTask模式下任务栈默认为启动他的activity所在任务栈,当待启动activity的TaskAffinity与启动他的activity的TaskAffinity不同时,待启动的activity所在任务栈就不再是启动它的activity所在的任务栈了。

如何标识activity的所处的任务栈

使用taskid获取,这个唯一标识。TaskAffinity也可获取单不是唯一标识,因为默认值都相同。这个值只是在singleTask模式下影响activity的taskid。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值