经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
粮草先行——Android折叠屏开发技术点(一)
来源:cnblogs  作者:萧文翰  时间:2019/1/31 9:06:21  对本文有异议

最近有关折叠屏产品的新闻层出不穷,各家手机厂商也分别慢慢地亮出了自家的产品。然而市场上的一些APP仍然没有很好地适配这样的设备,显示不正常和应用重启的状况时有发生。因此,我会用接下来的几篇文章来点出有关折叠屏开发中的一些需要注意的地方。
今天我们先来说一下生命周期,这是广大开发者特别需要注意的一点。
首先我们来看一下测试代码:

  1. public class MainActivity extends AppCompatActivity {
  2. private final String TAG = "MainActivity";
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. Log.d(TAG, "onCreate");
  8. }
  9. @Override
  10. protected void onStart() {
  11. super.onStart();
  12. Log.d(TAG, "onStart");
  13. }
  14. @Override
  15. protected void onResume() {
  16. super.onResume();
  17. Log.d(TAG, "onResume");
  18. }
  19. @Override
  20. protected void onPause() {
  21. super.onPause();
  22. Log.d(TAG, "onPause");
  23. }
  24. @Override
  25. protected void onStop() {
  26. super.onStop();
  27. Log.d(TAG, "onStop");
  28. }
  29. @Override
  30. protected void onDestroy() {
  31. super.onDestroy();
  32. Log.d(TAG, "onDestroy");
  33. }
  34. @Override
  35. protected void onRestart() {
  36. super.onRestart();
  37. Log.d(TAG, "onRestart");
  38. }
  39. @Override
  40. protected void onSaveInstanceState(Bundle outState) {
  41. super.onSaveInstanceState(outState);
  42. Log.d(TAG, "onSaveInstanceState");
  43. }
  44. @Override
  45. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  46. super.onRestoreInstanceState(savedInstanceState);
  47. Log.d(TAG, "onRestoreInstanceState");
  48. }
  49. @Override
  50. public void onConfigurationChanged(Configuration newConfig) {
  51. super.onConfigurationChanged(newConfig);
  52. Log.d(TAG, "onConfigurationChanged");
  53. }
  54. }

我在每一个生命周期和恢复现场的回调方法中都加了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的行为有几分相像。
此时我们面临两个选择:

  1. 重启APP以适应屏幕改变;
  2. 手动处理数据,避免APP重启。

对于第一种情况,我们一般在回调onSaveInstanceState()方法中保存数据,并在onCreate()或onRestoreInstanceState()回调方法中取回保存的数据用于恢复现场。
然而,并非在所有情况下都需要完整地重启APP来适应屏幕改变,和改变屏幕方向一样,我们只需要在Androidmanifest.xml中相应的Activity声明中加入相应的属性值即可。此处,需要添加:

  1. 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
如此,我们便处理完了对于折叠屏切换屏幕的优化。

原文链接:http://www.cnblogs.com/wenhanxiao/p/10338109.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号