粮草先行——Android折叠屏开发技术点(二)
继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项。实际上,与其说“多窗口开发”,不如说让我们的APP适应多窗口模式。
可能有朋友会问,为什么要提到多窗口模式呢?
这是因为:
- 折叠屏在展开后的屏幕会变大,而变大带来的变化就是多窗口运行;
- 多窗口模式在很早之前就已经被Google官方支持,提供了相应的API,现在也到了该了解一下的时候了;
- 避免我们辛辛苦苦开发好的APP,翻车在多窗口的沟里;
- 虽然在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折叠屏开发技术点(二)的更多相关文章
- 粮草先行——Android折叠屏开发技术点(一)
最近有关折叠屏产品的新闻层出不穷,各家手机厂商也分别慢慢地亮出了自家的产品.然而市场上的一些APP仍然没有很好地适配这样的设备,显示不正常和应用重启的状况时有发生.因此,我会用接下来的几篇文章来点出有 ...
- 粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则
上一篇文章中,我们有提到Activity在屏幕尺寸发生变更时的处理方式,总共有两种: 重启APP以适应屏幕改变: 手动处理数据,避免APP重启. 同样,这两种方式也同时适用于改变屏幕方向.更改系统语言 ...
- Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld
Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述———— 隐鹤 / HelloWorld 1. 引言 自本人第一篇博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要 ...
- 【Android】快速开发偷懒必备(二) 支持DataBinding啦~爽炸,一行实现花式列表[申明:来源于网络]
[Android]快速开发偷懒必备(二) 支持DataBinding啦~爽炸,一行实现花式列表[申明:来源于网络] 地址:http://blog.csdn.net/zxt0601/article/de ...
- Android 即时通讯开发小结(二)
<Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...
- 是时候学习Android分屏开发了
今年Google发布了Android N,Android N新增了不少功能,最受关注的自然就是分屏了. 这一功能对国内的很多手机用户并不陌生,其实很多第三方系统早已经实现了这一功能,如EMUI,Fly ...
- 【移动开发】Android中WIFI开发总结(二)
搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://smallwoniu.blog.51cto.com/3911954/1334951)我们已经简单了解了W ...
- Android网络:开发浏览器(二)——功能完善之长按网页图片菜单
上述的历史和书签的功能已经实现.不过如果我们长时间按住图片,并不会出现如同UC中的一系列选项,我们可以来看看UC中的长按图片出现的菜单. 图10.2.9 UC中的长按图片菜单 我们可以看到UC中 ...
- Android网络:开发浏览器(二)——功能完善之书签功能
经过上述的编写,基本的功能已经完成了,不过工具栏里面基本还是一片空白,只有一个刷新的功能,现在咱们就先完善这些功能(之前有朋友说来点图,那么这次我会截些图更好的来描述). 既然是浏览器,怎么能没有书签 ...
随机推荐
- memset库函数
头文件:#include <string.h> 定义函数:void * memset(void *s, int c, size_t n); 函数说明:memset()会将参数s 所 ...
- vue 使用踩坑 note
1. 如图,假如large那一行错写成 'large': item.ext_data.isLarge + '' === 'true',, 那么,编译不报错,控制台无提示,模板不输出. 2. vue的t ...
- centOS7固定IP
接续安装完成centOS虚拟机后,重启完成后,会出现如下的界面: 这里,我们使用root帐号和已配置的root密码进行登陆,登陆完成后,输入如下命令,运行结果如下图: dhclient 通过上述命令, ...
- SSM-MyBatis-01:IDEA的安装,永久注册和简单的MyBatis用例
一,IDEA的安装和永久注册 1.安装: 那到安装包,下一步,选路径,上面可以选操作系统64/32位,下面是程序的默认打开方式,可以不必勾选,也可以全选 路径一定不包含中文,重点 2.永久注册: 将此 ...
- RabbitMQ 入门【精+转】
rabbitmq可以用一本书取讲,这里只是介绍一些使用过程中,常用到的基本的知识点.官方文档覆盖的内容,非常全面:http://www.rabbitmq.com/documentation.html ...
- 数据结构 之 二叉堆(Heap)
注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被完全填满的二叉树,有可能的 ...
- jQuery学习之旅 Item5 $与jQuery对象
1.$符号的由来 $符号本质就是函数的名字. jquery源码分析 通过分析我们知道,在jquery里边不只可以使用$符号,还可以使用jQuery标志 解决冲突问题 有的项目是中间过渡项目(proto ...
- Python不同目录间模块调用
#!/usr/bin/python # -*- coding: utf-8 -*- # 导入其它目录下的文件, 需要去帮获取当前程序的绝对路径并加入到环境变量的相对路径中 import os impo ...
- SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。
本文是在学习https://blog.csdn.net/housisong/article/details/1452249一文的基础上对算法的理解和重新整理,再次非常感谢原文作者的深入分析以及分享. ...
- Java 链接SQL Server 数据库
1 //Java 连接 SQL Server数据库 2 public static final String DRIVERNAME="com.microsoft.sqlserver.jdbc ...