Android N Multi-Window Mode Support

1. Multi-Window Mode

  1. 如何进入分屏模式?

    • 长按Overview,App进入Split Screen Mode

    • 单击Overview,点击App标题栏上的吕形按钮,进入Split Screen Mode

    • 单击Overview,长按App标题栏拖入屏幕上的高亮区域,然后进入Freeform Screen Mode

  2. 如何配置App支持分屏模式?

    • 项目首先需要满足的

      targetSdkVersion >= Android N Preview

    • 项目AndroidManifest.xml中需要给MainActivity配置:

      android:resizeableActivity = true

      这个属性值在Android N的手机系统默认true,也就是默认支持分屏,前提是满足条件1。

  3. 名词:

    • Full Screen Mode:全屏幕模式

    • Split Screen Mode: 上下屏幕模式

    • Freeform Screen Mode: 自由尺寸屏幕模式

2. 分屏模式下被禁用的特性

  • 分屏模式下无法隐藏系统的状态栏
  • 分屏模式下无法根据屏幕方向旋转App

3. 分屏模式下Activity的生命周期和回调方法

  1. 正常情况下,切换分屏模式的生命周期

    • 长按overview进入分屏模式的Activity生命周期

      MainActivity: onMultiWindowModeChanged
      MainActivity: isInMultiWindowMode:true
      MainActivity: onPause
      MainActivity: onSaveInstanceState
      MainActivity: onStop
      MainActivity: onDestory
      MainActivity: onCreate
      MainActivity: onStart
      MainActivity: onRestoreInstanceState
      MainActivity: onResume
      //注意这里,这里是因为切换到Split Mode的时候,Activity会先立即失去焦点,这点很关键
      MainActivity: onPause

    • 退出分屏模式

      退出分屏模式时,基于分屏模式下Activity的状态,不同的状态生命周期回调有差异

      如果Activity处于 onPause状态,退出分配模式:

      MainActivity: onSaveInstanceState
      MainActivity: onStop
      MainActivity: onDestory
      MainActivity: onCreate
      MainActivity: onStart
      MainActivity: onRestoreInstanceSate
      MainActivity: onResume
      MainActivity: onPause
      MainActivity: onMultiWindowModeChanged
      MainActivity: isInMultiWindowMode:false
      MainActivity: onResume //这个Log不属于退出分屏流程的回调

      如果Activity处于onResume状态,退出分屏模式:

      MainActivity: onPause
      MainActivity: onSaveInstanceState
      MainActivity: onStop
      MainActivity: onDestroy
      MainActivity: onCreate
      MainActivity: onStart
      MainActivity: onRestoreInstanceState
      MainActivity: onResume
      MainActivity: D/MN: onMultiWindowModeChanged
      MainActivity: isInMultiWindowMode= false

      上面的Log输出说明了,如果退出分屏模式之前为onPause状态,则退出之后Activty也必须切换到onPause状态,然后调用的onResume不属于退出分屏的回调流程,属于Activity展示在前台进程获取焦点时的回调。反之,如果退出之前是onResume状态,则退出之后也必须是onResume,则不必再onResume

      总结就是:分屏模式下做一些操作,譬如退出分屏/改变分屏模式的尺寸,Activty在操作前的状态和操作后的状态要保持一致。至于Activity被放置到前台进程时触发的Activty生命周期回调方法,不属于分屏模式下操作的回调。

    • 分屏模式下,从一个Activity切换到和它同处于多窗口的另外一个Activity

      MainActivity: onPause

      SecondActivity: onResume

    • 分屏模式下,改变窗口的尺寸,也需要判断Activty的上一个状态 onPause/onResume

      操作之前处于onPause状态:

      MainActivity:D/MN: onSaveInstanceState
      MainActivity:onStop
      MainActivity:onDestroy
      MainActivity:onCreate
      MainActivity:onStart
      MainActivity:onRestoreInstanceState
      MainActivity:onResume
      MainActivity:onPause

      操作之前处于onResume状态:

      MainActivity:onPause
      MainActivity:onSaveInstanceState
      MainActivity:onStop
      MainActivity:onDestroy
      MainActivity: onCreate
      MainActivity:onStart
      MainActivity:onRestoreInstanceState
      MainActivity:onResume

    由上面的情况可以得知,当切换到多窗口模式或者改变多窗口模式下Activity 的尺寸时,Activity会被销毁然后重新加载。

  2. 特殊情况下,切换分屏模式的生命周期

    为了解决上述的Activity销毁重建的问题,特做了一下配置:

    1. 在AndroidManifest.xml文件中,给Activity加上属性配置如下:

      android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"

      • 在Activity中复写方法 onConfigurationChanged (不是必须,根据自身的情况来判断是否需要复写)

    在这种情况下由Full ScreenMode切换为Split Screen Mode,其生命周期:

    MainActivity:onPause
    MainActivity:onSaveInstanceState
    MainActivity:onStop
    MainActivity:onConfigurationChanged
    MainActivity:onMultiWindowModeChanged
    MainActivity:isInMultiWindowMode= true
    MainActivity:onRestart
    MainActivity:onStart
    MainActivity:onResume <

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值