Android面试-1 Activity生命周期和启动模式

生命周期分析

典型情况

  • ActivityA中打开ActivityB:ActivityA执行onPause,onSaveInstance,onStop,ActivityB执行onStart,onResume。注意ActivityB的onResume必须在ActivityA的onPause执行完后才会执行,
  • ActivityA中打开ActivityB,ActivityB为透明主题,ActivityA调用onPause, onSaveInstance
  • 按下Back键:执行onPause,onStop,onDestory
  • 按下Home键:执行onPause,onSaveInstance,onStop(因为系统可能在后台杀死当前Activity所以会调用onSaveInstance),之后再点击应用图标回来,则若未杀死则调用onRestart,onStart,onResume
  • onRestart方法在初次创建时不调用,只有当Activity从栈内调至栈顶时才会调用,onSaveInstanceState方法在页面关闭时都会执行,但是非系统原因的关闭,再次打开并不会执行onRestoreInstanceState恢复数据

异常情况

系统配置改变导致Activity杀死重建

  • 资源加载机制:很多资源会根据当前设备情况从res目录下拿到不同的值。比如尺寸(large,small等限定符,横竖屏图片)
  • 数据保存和恢复:异常情况下销毁Activity时会在onStop之前调用onSaveInstanceState,重建Activity时在onStart之后调用onRestoreInstanceState。这两个方法都是通过Window委托DecorView通知视图中每个View调用自身onSaveInstanceState或onRestoreInstanceState去保存View各自数据。
  • onRestoreInstanceState和onCreate中恢复数据区别:前者的Bundle必定不为null,所以可以无需判空。
  • 防止系统配置改变就重建:指定Activity的configChanges属性,如指定为orientation,则旋转屏幕时Activity不重建,只会调用onConfigurationChanged方法。

内存不足导致优先级低的Activity被杀死

前台(可见可交互) > 可见非前台(可见无法交互,如弹出Dialog) > 后台(执行了onStop)

启动模式

  • standard:普通的,注意若用非Activity类型的Context去直接启动会报错,因为这种Context不存在任务栈。所以需要添加一个FLAG_ACTIVITY_NEW_TASK, 才可以用非Activity类型的Context去启动,会新建一个任务栈类似singleTask。
  • singletop:若新启动的Activity在栈顶则直接调用该实例的onNewIntent;若不在栈顶,则新建Activity实例。比如为了防止连续两次按下登录导致生成两个主页Activity实例,可以使用sigletop启动模式。还适用于接受到消息后显示的界面,例如QQ接受到消息后弹出Activity,如果一次来10条消息,总不能一次弹10个Activity。
  • singletask:若找到了所需的任务栈,栈内有该Activity则回调onNewIntent(若Activity不处于栈顶则cleartop使其处于栈顶),栈内没有则新建Activity实例压入栈;若没有所需的任务栈,则新建所需任务栈,并新建Activity实例入栈。适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面
  • singleInstance:首次会新建一个任务栈和一个Activity实例放入,之后该Activity就单独位于一个任务栈,后续再启动它就不会创建新的Activity,除非该任务栈被销毁了。适合需要与程序分离开的页面,如通话界面。
  • 总结:standard每次启动都会创建实例,其他三种会根据情况选择创建还是重用实例,创建实例的生命周期onCreate->onStart->onResume, 重用实例的生命周期onNewIntent -> onResume

注意:

  • 若ActivityA启动的ActivityB的任务栈是另一个任务栈,则按back键时会先把ActivityB所在任务栈的所有Activity先出栈。
  • Activity所需的任务栈即通过TaskAffinity指定名字,并且需要和singletask或allowTaskReparenting配对使用,

 

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭