三星一直着眼于未来,在科技的领域不断探索,自去年Samsung Galaxy Fold上市以来,已有三款折叠机问世,在一代又一代产品的创新中,展现了手机外形新的趋势。在Galaxy Fold中,我们希望更大的屏幕可以让用户利用多窗口同时执行更多任务、一心多用,手机内外屏切换拥有连续性、自由切换。那么为了给用户带来无缝衔接、状态一致的体验,在多窗口和手机内外屏切换过程中,应用应保持界面的连续性、保留数据和状态。
多窗口和内外屏切换举例
1)在折叠屏内屏中,浏览网页或者阅读电子书,打开多窗口,用户的预期肯定是当前浏览的网页位置保持不变,或者电子书的章节和浏览位置保持不变。

  1. 同样,在内屏中浏览网页切换到外屏,或者从外屏切换到内屏,当前浏览的页面仍然要保持一致性和连续性,包括Tab位置和页面中的位置。

  2. 在应用搜索输入框中,用户输入了内容,这个时候无论是打开多窗口还是内外屏切换,输入的内容不能丢失。

  3. 在音视频类应用中,当正在播放音乐或者视频时,打开多窗口或者内外屏切换,不仅需要保持正在播放的位置,还需要恢复播放状态。比如正在播放视频的时候,打开多窗口,视频应可以继续播放。

    系统在多窗口转换或是内外屏切换时会触发配置变更,就像选择屏幕、切换语言触发配置变更一样,应用需要按照不同情况处理配置变更。可以采用系统默认的方法处理配置变更,也可以自行处理配置变更,下面介绍这两种方法。

1.运行时配置变更-系统默认

默认情况下,Activity因为配置变更会被销毁重建,应用需要保存和恢复界面的数据和状态。Android提供onSaveInstanceState()方法、ViewModel对象和本地存储空间三种保存界面状态的方法,应用可以根据界面数据的复杂程度、应用的场景和性能将这些方法组合使用,为用户提供合理顺畅的界面。

1.1 onSaveInstanceState()方法
对于简单的数据,Activity可以使用onSaveInstanceState()方法在onCreate() 或 onRestoreInstanceState()中恢复数据。因为onSavedInstanceState()会将数据序列化到磁盘,如果序列化的对象很复杂,会占用大量的内存。而且这个过程发生在主线程上,如果耗时太长,可能会导致卡顿。所以onSaveInstanceState()仅适用于轻量级数据,另外,onSaveInstanceState()最重要的用途是可以应对被系统杀掉的情况。
代码举例:
在onSaveInstanceState() 中保存数据:
static final String STATE_SCORE = “playerScore”;
static final String STATE_LEVEL = “playerLevel”;
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user’s current game state
savedInstanceState.putInt(STATE_SCORE, currentScore);
savedInstanceState.putInt(STATE_LEVEL, currentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
在onCreate() 中恢复数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we’re recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
currentScore = savedInstanceState.getInt(STATE_SCORE);
currentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
// …
}
参考Android官网:
https://developer.android.google.cn/guide/components/activities/activity-lifecycle.html
1.2 ViewModel
ViewModel是Android Jetpack的一个类,它可以在Activity Fragment生命周期内存储和管理UI界面相关的数据。将界面控制逻辑和数据管理分离开的方式更简便更高效,也有利于代码后期维护。
下图是Activity经历屏幕旋转后生命周期状态和ViewModel的生命周期,屏幕尺寸等配置变更同理。一般在系统首次调用Activity对象的onCreate()方法时请求ViewModel,ViewModel存在的时间范围是从首次请求ViewModel直到Activity销毁。Activity因为配置变更被销毁重建,而ViewModel不会被销毁,直到Activity Finished才会被销毁。

代码举例:
创建一个ViewModel类负责界面数据,在配置变更后,保存数据:
public class UserModel extends ViewModel {
private final MutableLiveData userLiveData = new MutableLiveData<>();
public LiveData getUser() {
return userLiveData;
}
public UserModel() {
// trigger user load.
}
void doAction() {
// depending on the action, do necessary business logic calls and update the
// userLiveData.
}
}
在Activity onCreate() 中通过
ViewModelProvider获取数据:
public class UserActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_activity_layout);
final UserModel viewModel = new ViewModelProvider(this).get(UserModel.class);
viewModel.getUser().observe(this, new Observer() {
@Override
public void onChanged(@Nullable User data) {
// update ui.
}
});
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.doAction();
}
});
}
}
参考Android官网:
https://developer.android.google.cn/reference/androidx/lifecycle/ViewModel
1.3 持久性存储
应用处理多窗口和开合折叠机保持界面状态时比较适合使用ViewModel 和onSaveInstanceState()这些机制来暂时存储瞬时界面状态。但ViewModel 和onSaveInstanceState()均不是长期存储解决方案,所以不能替代本地存储空间,例如数据库。对于复杂或大型应用数据,应用可以使用Room将数据保存到本地数据库。
Room是在SQLite的基础上提供了一个抽象层,让开发者可以便捷访问SQLite数据库。如需了解Room的详细介绍,请查看Android 官网:
https://developer.android.google.cn/training/data-storage/room?hl=zh_cn
四. 自行处理配置变更
应用也可以选择不重启自行处理配置变更,应用声明Activity 自行处理配置变更后,将阻止系统重启 Activity,应用自行调整界面。
声明自行处理配置变更的方法:
在manifest文件中 标签里添加 android:configChanges 属性,并至少包含screenSize|smallestScreenSize|screenLayout配置值。
代码示例:

当配置变更时,Activity会接收到onConfigurationChanged() 的调用消息。此方法会收到传递的Configuration对象,从而获得新设备配置,比如屏幕的分辨率信息。调用此方法时,Activity 的Resources对象会相应地进行更新,并根据新配置返回资源,以便在系统不重启 Activity的情况下轻松重置界面元素。应用应根据新的分辨率信息调整布局,恢复页面数据。
参考资料
https://developer.android.google.cn/guide/topics/resources/runtime-changes
https://developer.android.google.cn/topic/libraries/architecture/saving-states
https://developer.android.google.cn/topic/libraries/architecture/viewmodel
https://developer.samsung.com/galaxy-fold/app-continuity.html
联系我们
如果您在适配过程中遇到了技术问题,对折叠屏适配有任何建议或意见:
欢迎发邮件到:rdtpservice@samsung.com
邮件主题:三星折叠屏适配+APP名
感谢您的关注和参与!

三星折叠屏|保持屏幕状态相关推荐

  1. 曝三星折叠手机现屏幕断裂、闪屏等问题;亚马逊否认退出中国;京东入股五星电器 |...

    三星折叠屏手机上市两天后屏幕出现断裂等故障 在手机电池爆炸门之后,三星又遇到了公关危机.这次出事的是号称史上最贵智能手机之一的柔性折叠屏手机Galaxy Fold.至少四名测评人士发现,手机在使用第二 ...

  2. android 通知取消折叠_三星折叠屏手机发布会取消背后-折叠屏真的是用户想要的吗...

    应该说折叠屏是今天手机的一个新的形态,不管是华为之前发布的mateX还是三星Galaxy Fold,这种产品的形态相比现在很多手机产品在相机等等上面的卖力突破,会给人一种更加直观的感受,很多的数码爱好 ...

  3. 新华三首发数字大脑计划;微软进军物联网领域?说好的三星折叠屏发布会,就这样不开了?Google 发布小型芯片 Jacquard...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  4. 三星折叠屏手机爆火,但国内市场已经“不需要”

    三星开始想念并且试图重返中国市场了. 最近的手机巨头之间显然不太安宁,就在上个月苹果"十三香"刚刚血洗所有社交平台的热搜榜,转眼间,这个月的十九号就要迎来苹果秋季第二场发布会.诚然 ...

  5. 「镁客早报」三星折叠屏手机中国区发布会临时取消;特斯拉在地库中突然自燃...

    三星官方解释,取消的原因是因为场地因素,且推迟时间暂不能确定. 1.三星折叠屏手机中国区发布会临时取消 援引三星中国公关人士消息,三星已取消其折叠屏手机Galaxy Fold原定于下周三在上海召开的中 ...

  6. 「镁客早报」三星折叠屏手机中国区发布会临时取消;特斯拉在地库中突然自燃... 1

    三星官方解释,取消的原因是因为场地因素,且推迟时间暂不能确定. 1.三星折叠屏手机中国区发布会临时取消 援引三星中国公关人士消息,三星已取消其折叠屏手机Galaxy Fold原定于下周三在上海召开的中 ...

  7. 机你太美 | 华为vs三星折叠屏大战,结果王自如赢了?!

    关注微信公众号:八爪鱼大数据(bazhuayudata) 近日,三星vs华为折叠屏大战 经过3个Round对阵下来 目前战况如何? Round 1 发布日期谁先? 2月21日 三星在美国旧金山发布 其 ...

  8. 三星折叠屏这下彻底杯具了

    西雅图IT圈:seattleit [今日作者]宇直 宇宙第一直男 三星一个月前在万众期待中发布了 第一款折叠屏手机 可谓跨时代的产品 很多媒体纷纷给予高度评价 比如 然而从2019年4月17日开始,国 ...

  9. 三星折叠屏概念机视频泄露 传统手机形态将终结

    目前各大手机厂商都在抢占折未来折叠屏的市场,国产柔宇虽然是全球第一个发布折叠屏概念智能终端的厂商,但是紧随其后三星也在此前公布了折叠屏终端的雏形. 三星折叠屏概念机视频遭泄露 今天,三星越南不小心泄露 ...

最新文章

  1. python解析json
  2. 软件工程--第二章--可行性分析
  3. 微信监控机器学习、深度学习训练过程,可视化
  4. gif提取 python_编写Python爬虫抓取暴走漫画上gif图片的实例分享
  5. python数组初始化_Python科学计算库Numpy数组的初始化和基本操作
  6. 价值5000元的报表分享
  7. mysql ssl编译_MySQL8开启ssl加密
  8. 自己挖坑自己跳 之JsonMappingException: (was java.lang.NullPointerException) (through reference chain:)...
  9. Warez FAQ中英对照版
  10. 简单的扫描工具NTscan
  11. 第十届飞思卡尔杯智能车竞赛规则解读
  12. [Power Query] 数据格式转换
  13. java实验检查危险品代码_实验报告题目
  14. 在CentOS5上用 rvm 部署Rails3应用
  15. 华为用linux系统装eclipse,centos装eclipse
  16. iphone计算机要电话,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
  17. c语言的内存布局规律
  18. swiper循环轮播加文字动画
  19. C语言编程单片机相关资料,单片机的C语言编程资料.ppt
  20. android 版本更新忽略,安卓微信7.0.14 正式版更新,几个被你忽略的微信小技巧

热门文章

  1. 和微信大佬聊了一夜,他告诉我为什么指针被誉为 C 语言灵魂?
  2. Satwe楼板能用弹性模计算吗_密肋楼盖在PKPM计算中如何实现
  3. 浅谈双层玻璃的功效matlab代码,双层玻璃的功效-数学模型实验报告.doc
  4. “与其整天沉醉于别人的故事,不如自己安心多学一些,也留下点自己的故事。”
  5. (迪杰斯特拉)Dijkstra算法 与 普里姆算法(Prim算法)
  6. 最小生成树 普里姆算法
  7. 【专访】《妖怪宝可萌》H5游戏制作人朱顗:玩得轻松开心,留存就好。
  8. 数学/物理知识在软件/算法中应用(1),数学知识应用
  9. 优酷发布2018世界杯战略 阿里云将提供全程技术保障
  10. 拆书帮第14期训练营——作业十一:如何复盘