Forver.微笑

面带微笑未必真的开心,但笑起的那一刻,心中的那些不开心的事已经不重要了~

0%

Activity基础

Activity是Android四大组件之一,主要用于提供窗口与用户进行交互。

Activity的生命周期

基本生命周期

onCreate(null) -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()

前后台切换的生命周期

  • 切到后台时,保存数据
    onCreate() -> onStart() - > onResume() -> onPause() -> onSaveInstanceState()-> onStop()
  • 回到前台时(App被杀死,需要恢复保存的数据)
    onCreate(Bundle) -> onStart() -> onRestoreInstanceState(Bundle)-> onResume()
  • 回到前台时(App未被杀死,无需恢复保存的状态)
    onRestart() - > onResume()

屏幕旋转(键盘隐藏显示,屏幕大小改变等)的生命周期

  • 未配置android:configChanges时,Activity会重建
    onCreate() -> onStart() -> onResume() ->
  • 发生旋转
    onPause() -> onSaveInstanceState()-> onStop()->onDestroy()
    -> onCreate(Bundle) -> onStart() -> onRestoreInstanceState(Bundle)- > onResume()
  • 配置了android:configChanges时,Activity不会被重建,会调用onConfigurationChanged()方法

应用暂停(被其他透明actvity覆盖)的生命周期 或者 开启了多窗口模式(API24+),焦点在其他窗口

  • 启动到被透明Activity遮挡(可以看到UI,但是不能交换)
    onCreate() -> onStart() - > onResume() -> onPause()
  • 从透明Activity返回
    onResume

应用暂停(被其他半透明actvity覆盖)的生命周期 或者 开启了多窗口模式(API24+),焦点在其他窗口

  • 启动到被透明Activity遮挡(可以看到UI,但是不能交换)
    onCreate() -> onStart() -> onResume() -> onPause()
  • 从透明Activity返回
    onResume

不常用生命周期

  • onPostResume
    在onResume执行完毕后回调。一般在这个毁掉中获取view的宽高,在此之前View还没有初始化好,可能无法取到宽高。
  • onUserLeaveHint
    当用户按下home键或menu键时会回调

其他场景的生命周期

  • dialog不影响activity的生命周期

Activity的启动模式

示例

standard 默认模式

  • 每次都会创建一个新的实例,并将这个新的Activity加入当前task栈中
  • 一个Activity会有多个实例存在
  • 新的Activity和启动它的activity(standard,singleTop)在同一个任务栈
  • taskAffinity不会开启新的任务栈

    singleTop 栈顶复用模式

  • 当要被启动的Activity位于当前task栈顶时,复用当前Activity(回调onNewIntent);否则不复用,同standard。
  • 一个Activity在任务栈可能有多个实例存在
  • 新的Activity和启动它的activity(standard,singleTop)在同一个任务栈
  • taskAffinity不会开启新的任务栈

    singleTask 栈内复用模式:

  • 在同一个task栈中只有一个Activity实例。
  • 新的Activity和启动它的activity(standard,singleTop)在同一个任务栈
  • 如果栈中存在实例,则复用。且如果不在栈顶,移除栈顶一个或多个Activity
  • taskAffinity会开启新的任务栈

    singleInstance 全局唯一模式:

  • 全局(适用多个APP)只有一个Activity实例。若Activity已存在则复用,否则在一个全新的task栈创建新的Activity。
  • 新的Activity和启动它的activity不在同一个任务栈
  • singleInstance启动standard的Activity和启动它的activity(standard,singleTop)在同一个栈

Intent Flag

在代码中为Intent设置指定Flag,会达到可某些启动模式相同的效果
FLAG_ACTIVITY_NEW_TASK: 与singleTask的行为相同
FLAG_ACTIVITY_SINGLE_TOP:与singleTop的行为相同
FLAG_ACTIVITY_CLEAR_TOP:一般与FLAG_ACTIVITY_NEW_TASK一起使用,可以查找其他任务栈的的现有Activity。如果activity的启动模式为standard,系统会将其从堆栈中移除,并在它的位置启动一个新实例处理传入的intent。

startActivity不会报错permission denied的情况(符合一条且不和其他项冲突即可)

  • 同一Application下
  • Uid相同
  • permission匹配
  • 目标Activity的属性Android:exported=”true”
  • 目标Activity具有相应的IntentFilter,存在Action动作或其他过滤器并且没有设置exported=false
  • 启动者的Pid是一个System Server的Pid
  • 启动者的Uid是一个System Uid(Android规定android.system.uid=1000,具有该Uid的application,我们称之为获得Root权限)

控制Activity处于后台时的行为

当用户离开任务较长时,系统默认会清除任务中除根Activity以外的所有Activity,当用户返回时,只有根Activity会恢复。
可以通过修改Activity的属性修改此行为
alwaysRetainTaskState:值为true时,即使经过很长时间,任务仍然在堆栈中保留所有Activity
clearTaskOnLaunch:值为true时,只要用户离开任务再返回,就会返回到任务栈的初始状态,只剩根Activity,即使短暂离开也是。
finishOnTaskLaunch:与clearTaskOnLaunch类似,只是这个属性只会作用域单个Activity,该属性可能导致任何Activity消失,包括根。当用户离开再返回,属性设为true时,当前Activity会消失。