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

生命周期分析

典型情况

  • ActivityA中打开ActivityB:ActivityA执行onPause,onStop,ActivityB执行onStart,onResume。注意ActivityB的onResume必须在ActivityA的onPause执行完后才会执行,若ActivityB为透明主题则ActivityA只不会调用onStop。
  • 按下Back键:执行onPause,onStop,onDestory

异常情况

系统配置改变导致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,除非该任务栈被销毁了。适合需要与程序分离开的页面,如通话界面。

注意:

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



阅读更多
想对作者说点什么?

博主推荐

换一批

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