粮草先行——Android折叠屏开发技术点(一)
最近有关折叠屏产品的新闻层出不穷,各家手机厂商也分别慢慢地亮出了自家的产品。然而市场上的一些APP仍然没有很好地适配这样的设备,显示不正常和应用重启的状况时有发生。因此,我会用接下来的几篇文章来点出有关折叠屏开发中的一些需要注意的地方。
今天我们先来说一下生命周期,这是广大开发者特别需要注意的一点。
首先我们来看一下测试代码:
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onConfigurationChanged");
}
}
我在每一个生命周期和恢复现场的回调方法中都加了Logcat输出,我们来看一下切换屏幕时APP的具体表现。
2019-01-30 11:19:00.216 30205-30205/com.example.helloworld D/MainActivity: onPause
2019-01-30 11:19:00.221 30205-30205/com.example.helloworld D/MainActivity: onSaveInstanceState
2019-01-30 11:19:00.227 30205-30205/com.example.helloworld D/MainActivity: onStop
2019-01-30 11:19:00.228 30205-30205/com.example.helloworld D/MainActivity: onDestroy
2019-01-30 11:19:00.325 30205-30205/com.example.helloworld D/MainActivity: onCreate
2019-01-30 11:19:00.326 30205-30205/com.example.helloworld D/MainActivity: hashcode is 89642980
2019-01-30 11:19:00.327 30205-30205/com.example.helloworld D/MainActivity: onStart
2019-01-30 11:19:00.328 30205-30205/com.example.helloworld D/MainActivity: onRestoreInstanceState
2019-01-30 11:19:00.331 30205-30205/com.example.helloworld D/MainActivity: onResume
我们可以看到,默认情形下,Activity在屏幕尺寸发生改变的时候也随之重启了。 和改变屏幕Orientation的行为有几分相像。
此时我们面临两个选择:
- 重启APP以适应屏幕改变;
- 手动处理数据,避免APP重启。
对于第一种情况,我们一般在回调onSaveInstanceState()方法中保存数据,并在onCreate()或onRestoreInstanceState()回调方法中取回保存的数据用于恢复现场。
然而,并非在所有情况下都需要完整地重启APP来适应屏幕改变,和改变屏幕方向一样,我们只需要在Androidmanifest.xml中相应的Activity声明中加入相应的属性值即可。此处,需要添加:
android:configChanges="screenSize|smallestScreenSize|screenLayout"
添加好之后再次运行APP并反复改变屏幕大小,此时的生命周期回调顺序变为:
2019-01-30 11:13:02.217 29276-29276/com.example.helloworld D/MainActivity: onCreate
2019-01-30 11:13:02.219 29276-29276/com.example.helloworld D/MainActivity: onStart
2019-01-30 11:13:02.223 29276-29276/com.example.helloworld D/MainActivity: onResume
2019-01-30 11:13:05.289 29276-29276/com.example.helloworld D/MainActivity: onConfigurationChanged
可见,此时Activity并没有销毁重建,而是只回调了onConfigurationChanged()方法。在某些情况下,可用此办法避免APP重启。
那么,上述三个属性值各代表什么意思呢,详见下表:
| 属性值 | 含义 |
|---|---|
| screenSize | 当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。 |
| smallestScreenSize | 物理屏幕尺寸发生了变化。它表示与方向无关的尺寸变化,因此只有在实际物理屏幕尺寸发生变化(如切换到外部显示器)时才会变化。 对此配置的变更对应于smallestWidth 配置的变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。 |
| screenLayout | 屏幕布局发生了变化 — 这可能是由激活了其他显示方式所致。 |
注:上表摘自 https://developer.android.com/guide/topics/manifest/activity-element
如此,我们便处理完了对于折叠屏切换屏幕的优化。
粮草先行——Android折叠屏开发技术点(一)的更多相关文章
- 粮草先行——Android折叠屏开发技术点(二)
继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...
- 粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则
上一篇文章中,我们有提到Activity在屏幕尺寸发生变更时的处理方式,总共有两种: 重启APP以适应屏幕改变: 手动处理数据,避免APP重启. 同样,这两种方式也同时适用于改变屏幕方向.更改系统语言 ...
- 是时候学习Android分屏开发了
今年Google发布了Android N,Android N新增了不少功能,最受关注的自然就是分屏了. 这一功能对国内的很多手机用户并不陌生,其实很多第三方系统早已经实现了这一功能,如EMUI,Fly ...
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- Android 3D游戏开发
OpenGL ES(OpenGL Embedded System) Android 3D游戏开发技术宝典:OpenGL ES 2.0(android 3d游戏开发技术宝典 -opengl es 2.0 ...
- 聊聊真实的 Android TV 开发技术栈
智能电视越来越普及了,华为说四月发布智能电视跳票了,一加也说今后要布局智能电视,在智能电视方向,小米已经算是先驱了.但是还有不少开发把智能电视简单的理解成手机屏幕的放大,其实这两者并不一样. 一.序 ...
- Android 开发技术周报 Issue#277
新闻 Android 11界面再调整:加入快速截屏.多任务向国产ROM看齐 最新版Android 11推送 谷歌Pixel 5被曝光:支持反向充电 4月Android系统版本分布:8.0 Oreo最主
- 本人讲课时录制的Android应用开发技术教学视频
网盘地址:http://yun.baidu.com/pcloud/album/info?query_uk=1963923831&album_id=3523786484935252365 本人讲 ...
- Android开发技术周报
Android开发技术周报 原文 http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当 ...
随机推荐
- Java集合--TreeSet详细解析
目录 1.构造函数 2.增 3.删 4.比较器 总结 谈到TreeSet的特点,估计大家脑海里想到的都是:有序,不可重复,红黑树,基于Treemap实现,自定义排序等特点.这篇博客帮助大家从源码梳理下 ...
- 自学java能不能找到找到一份java工作。
关于自学Java能不能通过社招找到一份互联网公司Java开发的工作,有无数的人问出这样的问题,答案没有标准的,只能从概率去考虑.有的人可以,有的人不可以,有的人自学就业的概率就是高,有的概率就是低. ...
- 链表底层实现Java的Map(上)
链表实现Map public class LinkListMap<K,V> implements Map<K,V> { private class Node { public ...
- SpringSecurityOauth RCE (CVE-2016-4977) 分析与复现
目录 0x00 前言 0x01 调试分析 0x02 补丁分析 0x03 参考 影响版本: 2.0.0-2.0.9 1.0.0-1.0.5 0x00 前言 这个漏洞与之前那个SpringBoot的SpE ...
- 如何使用AWS和Azure的配置存储服务保存读取配置
原文:Want to yank configuration values from your .NET Core apps? 作者:pauljwheeler 译文:https://www.cnblog ...
- Maven把项目依赖的所有jar包都打到同一个jar中
目录 1 使用maven-shade-plugin 2 推荐: 使用maven-assembly-plugin 3 扩展: Maven安装本地jar包到本地仓库 4 扩展: 手动生成jar包 5 扩展 ...
- SpringBoot从零单排 ------初级入门篇
有人说SSM已死,未来是SpringBoot和SpringCloud的天下,这个观点可能有点极端,但不可否认的是已经越来越多的公司开始使用SpringBoot.所以我将平时学习SpringBoot的内 ...
- matplotlib种类
matplotlib模板: 1:线图 plot()单线段图 2:多个线图 subplot()Multiple axes (i.e. subplots) are created with the sub ...
- Windows代码,添加一个节,以及RVA跟FOA互相转化,以及内存文件对齐代码.
/ 1.修改文件头节个数 +1 2.修改ImageBase 3.遍历节表,拷贝最后一个节表到下面 4.修改节的虚拟大小(节表.virtualSize) 5.修改节的虚拟地址(RVA 节表.virtua ...
- 分享自己写的一个.net方法缓存源码
在服务器性能优化中,我们更多的是要考虑到缓存的使用,分享一个自己编写的方法缓存的框架,使用非常方便.话不多说,先上使用例子: 1.定义要使用缓存的类及方法: public class Example ...