继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项。实际上,与其说“多窗口开发”,不如说让我们的APP适应多窗口模式

可能有朋友会问,为什么要提到多窗口模式呢?

这是因为:

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

首先我们来看一下如果我们什么都不做,切换多窗口时,会发生什么呢?仍然从生命周期的角度来解读:

失去焦点(未做兼容处理)

D/MainActivity: onPause

重新获得焦点(未做兼容处理)

D/MainActivity: onResume

注意,在默认情况下,一旦失去焦点,会回调onPause()方法。而此时Activity仍然可以被用户看到,因此,如果我们在onPause()里面做了一些不合适的操作,比如来了一个手势解锁,或者特殊情况下直接关闭程序,就明显不合适了。

为了避免这种情况出现,我们希望在失去焦点的时候不回调onPause()。那么,我们只需在AndroidManifest.xml的application节点下添加如下代码,即可规避该问题:

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

再次测试时,我们发现onPause()已经不会被回调了。

到这里,我们有这样一个疑问:我们失去onPause()作为得到/失去焦点的判定依据,我们用什么来得知状态呢?

很简单——借助onWindowFocusChanged()回调,即可及时获取焦点状态了。使用如下代码片进行测试:

   @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

……

至此,问题解决。

然而,你可能还会问:如果小窗口的尺寸发生变化如何处理?

这并不困难,通过调整APP窗口大小,再次观察Logcat输出,发现onConfigurationChanged()方法被回调了。还记得我们之前提过的改变窗口大小吗?这就是一个实际的例子。该如何处理,大家心中应该有数了吧。

今天的分享就到这里,希望上面的内容能够对你有帮助。

粮草先行——Android折叠屏开发技术点(二)的更多相关文章

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

    最近有关折叠屏产品的新闻层出不穷,各家手机厂商也分别慢慢地亮出了自家的产品.然而市场上的一些APP仍然没有很好地适配这样的设备,显示不正常和应用重启的状况时有发生.因此,我会用接下来的几篇文章来点出有 ...

  2. 粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则

    上一篇文章中,我们有提到Activity在屏幕尺寸发生变更时的处理方式,总共有两种: 重启APP以适应屏幕改变: 手动处理数据,避免APP重启. 同样,这两种方式也同时适用于改变屏幕方向.更改系统语言 ...

  3. Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld

    Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述———— 隐鹤  /  HelloWorld 1. 引言 自本人第一篇博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要 ...

  4. 【Android】快速开发偷懒必备(二) 支持DataBinding啦~爽炸,一行实现花式列表[申明:来源于网络]

    [Android]快速开发偷懒必备(二) 支持DataBinding啦~爽炸,一行实现花式列表[申明:来源于网络] 地址:http://blog.csdn.net/zxt0601/article/de ...

  5. Android 即时通讯开发小结(二)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...

  6. 是时候学习Android分屏开发了

    今年Google发布了Android N,Android N新增了不少功能,最受关注的自然就是分屏了. 这一功能对国内的很多手机用户并不陌生,其实很多第三方系统早已经实现了这一功能,如EMUI,Fly ...

  7. 【移动开发】Android中WIFI开发总结(二)

    搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://smallwoniu.blog.51cto.com/3911954/1334951)我们已经简单了解了W ...

  8. Android网络:开发浏览器(二)——功能完善之长按网页图片菜单

    上述的历史和书签的功能已经实现.不过如果我们长时间按住图片,并不会出现如同UC中的一系列选项,我们可以来看看UC中的长按图片出现的菜单. 图10.2.9    UC中的长按图片菜单 我们可以看到UC中 ...

  9. Android网络:开发浏览器(二)——功能完善之书签功能

    经过上述的编写,基本的功能已经完成了,不过工具栏里面基本还是一片空白,只有一个刷新的功能,现在咱们就先完善这些功能(之前有朋友说来点图,那么这次我会截些图更好的来描述). 既然是浏览器,怎么能没有书签 ...

随机推荐

  1. 关于mysql中的DDL,DML,DQL和DCL

    SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库和表 ...

  2. xml、网络编程、 反射

    XML 常用于配置文件.传输数据. <?xml version="1.0" encoding="UTF-8"?><persons> &l ...

  3. 注解(Annotation)自定义注解入门

    摘自:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准 ...

  4. C语言可变参数va_list

    一.什么是可变参数 在C语言编程中有时会遇到一些参数个数可变的函数,例如printf(),scanf()函数,其函数原型为: int printf(const char* format,-) int ...

  5. SSM-SpringMVC-20:SpringMVC中处理器方法之返回值void篇

      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 处理器的方法我们之前做过,返回值为String的,返回值为ModelAndView的,我们这个讲的这个返回 ...

  6. Spring提取@Transactional事务注解的源码解析

    声明:本文是自己在学习spring注解事务处理源代码时所留下的笔记: 难免有错误,敬请读者谅解!!! 1.事务注解标签 <tx:annotation-driven /> 2.tx 命名空间 ...

  7. 微信公众号开发 包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证 2017.12.2

    https://www.cnblogs.com/klmei/p/7060879.html  基础配置很全面

  8. CentOS 6.2+Nginx+Nagios,手机短信和qq邮箱提醒

    http://chenhao6.blog.51cto.com/6228054/1323192 标签:软件包 配置文件 nagios 服务端 监控 原创作品,允许转载,转载时请务必以超链接形式标明文章  ...

  9. SourceTree安装跳过注册

    问题描述 SourceTree是一个可视化管理版本文件的工具,但是注册的时候需要打开外国的网站. 因此要安装时需要绕过这一步才能使用. 解决方案 1. 在下面路径下创建一个accounts.json文 ...

  10. BigInteger类及方法应用

    注:以下内容来自传智播客(itcast)老师授课 BigInteger 可以让超过Integer范围内的数据进行运算 构造方法 public BigInteger(String val) 成员方法 p ...