当前位置:   article > 正文

android 设置 屏幕旋转 不重启应用_三星折叠屏|保持屏幕状态

android:configchanges='screensize|smallestscreensize|screenlayout

三星一直着眼于未来,在科技的领域不断探索,自去年Samsung Galaxy Fold上市以来,已有三款折叠机问世,在一代又一代产品的创新中,展现了手机外形新的趋势。在Galaxy Fold中,我们希望更大的屏幕可以让用户利用多窗口同时执行更多任务、一心多用,手机内外屏切换拥有连续性、自由切换。那么为了给用户带来无缝衔接、状态一致的体验,在多窗口和手机内外屏切换过程中,应用应保持界面的连续性、保留数据和状态。

多窗口和内外屏切换举例

1)在折叠屏内屏中,浏览网页或者阅读电子书,打开多窗口,用户的预期肯定是当前浏览的网页位置保持不变,或者电子书的章节和浏览位置保持不变。

657d4c0a3efd41631ac2b40da1a72fbc.png

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

bf1d7559e8da399faa31a3f6cde2c529.png

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

34171adf1e158e28bac1e24869741c60.png

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

8889bb9d1bac4177bfda9162d7f0c3f5.png

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

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

fc542888a59fd5f8b5386f28630ee6a1.png

默认情况下,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才会被销毁。

d90f815b6e6d77a53acadfcc6d186a92.png

代码举例:

创建一个ViewModel类负责界面数据,在配置变更后,保存数据:

public class UserModel extends ViewModel {

private final MutableLiveData<User> userLiveData = new MutableLiveData<>();

public LiveData<User> 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文件中 <activity> 标签里添加 android:configChanges 属性,并至少包含screenSize|smallestScreenSize|screenLayout配置值。

代码示例:

<activity android:name=".MyActivity"

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名

感谢您的关注和参与!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/126352
推荐阅读
相关标签
  

闽ICP备14008679号