Android面试题之Activity

Activity是Android的基础,是Android开发人员必须要掌握的基础知识之一。请阅读Android必读之Activity基础

一.生命周期全解析

1.典型情况下Activity生命周期
《Android面试题之Activity》
《Android面试题之Activity》
《Android面试题之Activity》

不要在onCreate,onStart,onResume,onPause几个方法进行耗时操作,否则会造成页面切换卡顿。
广播的注册和解绑要成对出现,比如在OnCreate中注册,在onStop或者onDestory中解绑,在 onResume中注册,在onPause中解绑。

推荐阅读:对Activity生命周期方法的感性理解

2 .Activity生命周期的切换过程

  1. 启动一个Activity:
    onCreate()–>onStart()–>onResume()
  2. 打开一个新Activity:
    旧Activity的onPause() –>新Activity的onCreate()–>onStart()–>onResume()–>旧Activity的onStop()
  3. 返回到旧Activity:
    新Activity的onPause()–>旧Activity的onRestart()–>onStart()–>onResume()–>新Activity的onStop()–>onDestory();
  4. Activity1上弹出对话框Activity2:
    Activity1的onPause()–>Activity2的onCreate()–>onStart()–>onResume()
  5. 关闭屏幕/按Home键:
    新Activity:onPause()–>onStop()
  6. 点亮屏幕/回到前台:
    新Activity:onRestart()–>onStart()–>onResume()
  7. 关闭对话框Activity2:
    Activity2的onPause()–>Activity1的onResume()–>Activity2的onStop()–>onDestroy()
  8. 销毁Activity1:
    onPause()–>onStop()–>onDestroy()

参考文章:实际体验Activity生命周期

3.生命周期的各阶段

  • 完整生命周期:
    Activity在onCreate()和onDestroy()之间所经历的。
    在onCreate()中完成各初始化操作,在onDestroy()中释放资源。
  • 可见生命周期:
    Activity在onResume()和onPause()之间所经历的。

    注意:onStart是即将对用户可见之前调用,onStop在onPause之后页面就不对用户可见了。

    活动对于用户是可见的,但仍无法与用户进行交互。

  • 前台生命周期:Activity在onResume()执行之后和onPause()之前所经历的。
    活动可见,且可交互

4.onSaveInstanceState和onRestoreInstanceState

  1. 出现时机:异常、 Activity被系统回收
  2. 无法保证系统会在销毁您的 Activity 前调用 onSaveInstanceState(),因为存在不需要
    保存状态的情况(例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭
    Activity)。 如果系统调用 onSaveInstanceState(),它会在调用 onStop() 之前,并
    且可能会在调用 onPause() 之前进行调用
  3. 在onRestoreInstanceState获取保持的数据进而回复Activity的状态
    推荐阅读:onSaveInstanceState和onRestoreInstanceState详解

5.Activity异常情况下生命周期分析

  1. 由于资源相关配置发生改变,导致Activity被杀死和重新创建
    例如屏幕发生旋转:当竖屏切换到横屏时,会先调用onSaveInstanceState来保存切换时的数据,接着销毁当前的Activity,然后重新创建一个Activity,再调用onRestoreInstanceState恢复数据。
    onSaveInstanceState–>onPause(不定)–>onStop–>
    onDestroy–>onCreate–>onStart–>onRestoreInstanceState–>onResume

    为了避免由于配置改变导致Activity重建,可在AndroidManifest.xml中对应的Activity中设置 android:configChanges=
    "orientation|screenSize"。此时再次旋转屏幕时,该Activity 不会被系统杀死和重建,只会调用onConfigurationChanged。
    因此,当配置程序需要响应配置改 变,指定configChanges属性,重写onConfigurationChanged方法即可。

     

  2. 由于系统资源不足,导致优先级低的Activity被回收
    Activity优先级排序:前台可见Activity>前台可见不可交互Activity(前台Activity弹出Dialog)>后台Activity
    (用户按下Home键、切换到其他应用)

    推荐阅读:异常情况下的生命周期分析

二.Activity四种启动模式

推荐阅读:Android必读之SingleTop、SingleTask等Activity启动方式的区别
Android必读之TaskAffinity

1.设置Activity启动模式的方法

  1. a.在AndroidManifest.xml中给对应的Activity设定属性android:launchMode=”standard|singleInstance|single Task|singleTop”。
  2. 通过标记位设定,方法是intent.addFlags(Intent.xxx)。

2.Activity的四种LaunchMode

  1. .standard:标准模式、默认模式
    含义:每次启动一个Activity就会创建一个新的实例。
    注意:使用ApplicationContext去启动standard模式Activity就会报错。因为standard模式的Activity会默认进入启动它所属的任务栈,但是由于非Activity的Context没有所谓的任务栈。
  2. .singleTop:栈顶复用模式
    含义:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调onNewIntent(intent)方法。
  3. .singleTask:栈内复用模式
    含义:只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。
  4. .singleInstance:单实例模式
    含义: 具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。

3.IntentFilter匹配规则

  1. 一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算完全匹配,才能启动该Activity。
  2.  一个Activity可以有多个 intent-filter,一个 intent只要成功匹配任意一组intent-filter,就可以启动该Activity。
    a. action匹配规则:
    要求intent中的action 存在且必须和intent-filter中的其中一个 action相同。
    区分大小写。
    b. category匹配规则:
    intent中的category可以不存在,这是因为此时系统给该Activity 默认加上了< category android:name=”android.intent.category.DEAFAULT” />属性值。
    除上述情况外,有其他category,则要求intent中的category和intent-filter中的所有category 相同。
    c. data匹配规则:
    如果intent-filter中有定义data,那么Intent中也必须也要定义data。
    data主要由mimeType(媒体类型)和URI组成。在匹配时通过intent.setDataAndType(Uri data, String type)方法对date进行设置。

    采用隐式方式启动Activity时,可以用PackageManager的resolveActivity方法或者Intent的 resolveActivity方法判断是否有
    Activity匹配该隐式Intent。

推荐阅读:intent-filter的action,category,data匹配规则
Android必读之Intent 和 Intent 过滤器
Android中Intent的显示和隐式使用

点赞

发表评论