粮草先行——Android折叠屏开发技术点(二)

继该系列的第一篇和番外篇以后,今天咱们来聊一聊多窗口开发的注意事项。实际上,与其说“多窗口开发”,不如说让咱们的APP适应多窗口模式
可能有朋友会问,为何要提到多窗口模式呢?
这是由于:android

  1. 折叠屏在展开后的屏幕会变大,而变大带来的变化就是多窗口运行;
  2. 多窗口模式在很早以前就已经被Google官方支持,提供了相应的API,如今也到了该了解一下的时候了;
  3. 避免咱们辛辛苦苦开发好的APP,翻车在多窗口的沟里;
  4. 虽然在Android Q中,多窗口模式极可能将成为默认行为,但要兼容以前的版本,咱们仍然须要作一些事情。

首先咱们来看一下若是咱们什么都不作,切换多窗口时,会发生什么呢?仍然从生命周期的角度来解读:app

失去焦点(未作兼容处理)ide

D/MainActivity: onPause测试

从新得到焦点(未作兼容处理)code

D/MainActivity: onResumexml

注意,在默认状况下,一旦失去焦点,会回调onPause()方法。而此时Activity仍然能够被用户看到,所以,若是咱们在onPause()里面作了一些不合适的操做,好比来了一个手势解锁,或者特殊状况下直接关闭程序,就明显不合适了。
为了不这种状况出现,咱们但愿在失去焦点的时候不回调onPause()。那么,咱们只需在AndroidManifest.xml的application节点下添加以下代码,便可规避该问题:生命周期

<meta-data
  android:name="android.allow_multiple_resumed_activities"
  android:value="true"/>

再次测试时,咱们发现onPause()已经不会被回调了。
到这里,咱们有这样一个疑问:咱们失去onPause()做为获得/失去焦点的断定依据,咱们用什么来得知状态呢?
很简单——借助onWindowFocusChanged()回调,便可及时获取焦点状态了。使用以下代码片进行测试:ip

@Override
   public void onWindowFocusChanged(boolean hasFocus) {
       super.onWindowFocusChanged(hasFocus);
       Log.d(TAG, "onWindowFocusChanged - " + hasFocus);
   }

使APP反复获得/失去焦点,观察Logcat输出,获得以下结果:开发

D/MainActivity: onWindowFocusChanged - false
D/MainActivity: onWindowFocusChanged - true
D/MainActivity: onWindowFocusChanged - false
D/MainActivity: onWindowFocusChanged - true
……it

至此,问题解决。
然而,你可能还会问:若是小窗口的尺寸发生变化如何处理?
这并不困难,经过调整APP窗口大小,再次观察Logcat输出,发现onConfigurationChanged()方法被回调了。还记得咱们以前提过的改变窗口大小吗?这就是一个实际的例子。该如何处理,你们心中应该有数了吧。 今天的分享就到这里,但愿上面的内容可以对你有帮助。

相关文章
相关标签/搜索