Android面试基础篇---Activity(上)

**

前言:

**

一、生命周期

1.七个方法:

1.1:onCreate() 在这里创建界面,做一些数据的初始化工作
1.2:onStart() 可见不可交互
1.3:onResume() 可见可交互
1.4:onPause() 可见但是不可交互的,系统停止动画等。 消耗CPU的任务。应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存那你的数据,应该在onResume()里读出来。注意:这个方法里做的事情时间要短,因为下一个Activity不会等到这个方法完成才启动变得不可见。
1.5:onStop() 变得不可见,被下一个Activity覆盖了
1.6:onRestart() 重新可见
1.7:onDestroy() 摧毁Activity

二、生命周期图

这里写图片描述

三、常见的应用场景

3.1 启动:onCreate()–>onStart()–>onResume(), Activity进入运行状态
3.2 退居后台:当前Activity转到新的Activity界面或者按HOME键回到主页面。onPause()–>onStop()进入停滞状态
3.3 Activity退居后台,且系统内存不足,系统会杀死这个后台状态的Activity(此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null),若再次回到这个Acitivty,则会走onCreate()–>onStart()–>onesume()(将重新走一次Activity的初始化生命周期)
3.4 锁定屏幕与解锁屏幕,只会调用onPause(),而不会调用onStop()方法,开屏后则调用onResume()
3.5 当Activity被另一个透明或者Dialog样式的Activity覆盖时就会onPause,这时它仍然可见,只是失去焦点,补课与用户交互

四、可能会遇到的问题

4.1 画生命周期图

4.2 onStart()与onResume()有什么区别?
onStart()方法在onCreate()方法之后被调用或者在Activity从Stop状态转换为Active状态时被调用,一般执行了onStart()后就执行onResume()
onResume()在Activity从 Pause 状态转换为Active状态时被调用,使 Activity 获得焦点,可以再与用户交互

五、Activity的四种启动模式

5.1 Standard 标准模式
默认启动模式,每个发送的Intent都会创建一个新的Activity,并且将其放入任务栈栈顶,而不管这个Activity,是否已经存在。Activity的启动三回调(onCreate()—>onStart()—>onResume())都会执行,也就是说每次创建一个新的实例
若在C Activity中加入点击事件,须要跳转到还有一个同类型的C Activity。结果是还有一个C Activity进入栈中,成为栈顶。
这里写图片描述

5.2 SingleTop 栈顶复用模式
如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以他的启动三回调就不会执行,同时Activity的 onNewIntent() 方法会被回调,如果Activity已经存在却不在栈顶,那么作用和标准模式一样,一个新的Activity会被创建并放到栈顶,在这个模式下,我们必须同时在onCreate() 和onNewIntent() 两个方法中处理好传入的Intent

情况一:在C Activity中加入点击事件,须要跳转到还有一个同类型的C Activity。
结果是直接复用栈顶的C Activity。

情况二:在C Activity中加入点击事件,须要跳转到还有一个A Activity。结果是创建一个新的Activity入栈。成为栈顶。
这里写图片描述

5.3: SingTask 栈内复用模式
如果栈中任意位置已经有了一个Activity实例,那么这个Activity就会被回调到栈顶,始终保持一个实例,同时回调 onNewIntent() , 并且singleTask 会清理在当前Activity 上面的所有的Activity

情况一:在C Activity中加入点击事件,须要跳转到还有一个同类型的C Activity。结果是直接用栈顶的C Activity。情况二:在C Activity中加入点击事件,须要跳转到还有一个A Activity。

结果是将A Activity上面的B、C所有销毁,使A Activity成为栈顶。
这里写图片描述

5.4: SingleInstance 单例模式
这个模式和SInglesTask很接近,只会有一个实例存在,不同点是持有这个Activity 的 Task 不能再有其他 Activity 实例了。
如果从这个 Activity 中启动另外一个不同的 Activity ,将自动创建一个新的 Task 来存放新的Activity.
如果从一个已经存在许多 Activity 的 Task 中调用 singleInstance Activity .这个新 Activity 同样会被放在一个新的 Task 中

5.5 应用场景
咱们比如说搜索功能,当用户在搜索条中搜索完会跳转到 SearchActivity 查看搜索结果。通常我们在结果页面的顶端也会放置一个同样的搜索条,这样的话呢,用户就不需要回退就可以进行相同的搜索

六、横竖屏切换时候的生命周期

有时候小伙伴在面试的时候会遇到让你写出横竖屏切换时候的生命周期,现在我先来给大家说说我总结的生命周期变化吧

总结:

  1. 不设置 Activity 的 android:cnfigChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时执行两次
  2. 设置 Activity 的 android:configChanges=”orientation” 时,切屏还是会重新调用各个生命周期,切换竖屏时只会执行一次
  3. 设置Activity的android:configChanges=”orientaion|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

下面给大家讲讲具体实现过程:
1、新建一个Activity,并把各个生命周期打印出来

2、运行Activity,得到如下信息

onCreate–>
onStart–>
onResume–>

3、按crtl+f12切换成横屏时

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>
onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

5、修改AndroidManifest.xml,把该Activity添加 android:configChanges=”orientation”,执行步骤3

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>
onConfigurationChanged–>

7、把步骤5的android:configChanges=”orientation” 改成 android:configChanges=”orientation|keyboardHidden”,执行步骤3,就只打印onConfigChanged

onConfigurationChanged–>

8、执行步骤4

onConfigurationChanged–>
onConfigurationChanged–>

好了,今天就写到这吧,喜欢我文章的话请关注我,期待下次给大家带来更多Android的相关知识,与大家一起成长!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值