上一篇文章中,我们有提到Activity在屏幕尺寸发生变更时的处理方式,总共有两种:

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

同样,这两种方式也同时适用于改变屏幕方向、更改系统语言、甚至输入法等等。

因此,本文也同样适用于改变屏幕方向等情况的处理。

或许你会有疑问:我们该如何选择合适的处理方式呢?

我给你的答案是:选择最合适的。

这么说好像跟没说一样,别急,给大家举个例子就明白了:

比如更改屏幕方向,由竖屏转换为横屏,如果我们只有一套布局,符合按比例缩放仍然显示正常的话,我们大可以选择第2种处理方案。但是如果我们的横竖屏布局是不同的,比如系统中的“设置”应用,那么我们选择第2种处理方案就是不合适的。

下图:



这是一个典型的横竖屏分别采用不同布局的例子。

我们确定要采取那种解决方案后,接下来很可能要面对另一个问题,就是性能瓶颈。

根据前一篇文章的实验结果,在发生横竖屏切换的时候,Activity的生命周期通常会按照如下顺序依次执行:

D/MainActivity: onPause

D/MainActivity: onSaveInstanceState

D/MainActivity: onStop

D/MainActivity: onDestroy

D/MainActivity: onCreate

D/MainActivity: onStart

D/MainActivity: onRestoreInstanceState

D/MainActivity: onResume

如果我们在生命周期中做了一些繁重的工作,那么整个Activity在重启的过程中就会很慢。

要解决这个问题,首先我们要找Fragment帮忙,因为Bundle并不是用来传递大型对象的,而且这个对象还需要序列化和反序列化,如此执行起来就更慢了。

当然,如果你只是保存一些整型或者字符串的话,单纯使用Bundle而不借助Fragment也是可以的,但是这样的场景在实际开发中并不常见。

要借助Fragment来中转对象,我们采用下面三步走的方式:

  1. 在Fragment类中调用 setRetainInstance(true);
  2. 在Activity销毁时向Fragment类存入数据;
  3. 在Activity重建后根据Tag检索Fragment,并取出之前存入的数据。

下面用具体的代码片来演示:

首先来看Fragment类:

public class TestFragment extends Fragment {

    private MyData data;

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
} public void setData(MyData data) {
this.data = data;
} public MyData getData() {
return data;
}
}

我们再来看Activity类:

public class MyActivity extends Activity {

    private TestFragment mTestFragment ;

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentManager fm = getFragmentManager();
mTestFragment = (TestFragment)fm.findFragmentByTag(“test”); if (retainedFragment == null) {
mTestFragment = new TestFragment ();
fm.beginTransaction().add(mTestFragment, “test”).commit();
mTestFragment.setData(restoreData());
}
} @Override
public void onDestroy() {
super.onDestroy();
mTestFragment.setData(saveData());
}
}

这里还要特别注意一点:在中转对象数据时,不要传入与Activity紧密相关的对象,比如View,否则会造成内存泄漏。

至此,就完成了对重启Activity方案的性能优化。

粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则的更多相关文章

  1. 粮草先行——Android折叠屏开发技术点(二)

    继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...

  2. 粮草先行——Android折叠屏开发技术点(一)

    最近有关折叠屏产品的新闻层出不穷,各家手机厂商也分别慢慢地亮出了自家的产品.然而市场上的一些APP仍然没有很好地适配这样的设备,显示不正常和应用重启的状况时有发生.因此,我会用接下来的几篇文章来点出有 ...

  3. 知识图谱实战开发案例剖析-番外篇(1)- Neo4j是否支持按照边权重加粗和大数量展示

    一.前言 本文是<知识图谱实战开发案例完全剖析>系列文章和网易云视频课程的番外篇,主要记录学员在知识图谱等相关内容的学习 过程中,提出的共性问题进行展开讨论.该部分内容原始内容记录在网易云 ...

  4. Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread

    事件派发线程是java Swing开发中重要的知识点,在安卓app开发中,也是非常重要的一点.今天我们在多线程开发中,穿插进来这个线程.分别从线程的来由.原理和使用方法三个方面来学习事件派发线程. 一 ...

  5. 【C# 开发技巧】番外篇故事-我是一个线程

    我是一个线程 我是一个线程,一出生就被编了一个号——0x3704,然后被领到一间昏暗的屋子里,在这里,我发现了很多和我一模一样的同伴.我身边的同伴0x6900待的时间比较长,他带着沧桑的口气对我说:“ ...

  6. SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心

    写在开头 研发过程中经常要做的事就是启动Eureka服务注册中心,每每都要启动一个IDEA,很是困扰.现在分享一个后台启动服务注册中心的方法. 准备工作 1打包一个eureka服务注册中心jar包(注 ...

  7. Monkey源代码分析番外篇之Android注入事件的三种方法比較

    原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析 ...

  8. 番外篇!全球首个微信应用号开发教程!小程序 DEMO 视频奉上!

    大家好,我是博卡君.经过国庆节的七天假期,相信很多朋友都已经研究出自己的小程序 demo 了吧?我最近也利用休息时间关注了一下网上关于小程序开发的讨论,今天就利用这个番外篇谈谈自己对小程序的一些想法吧 ...

  9. 【重走Android之路】【番外篇】关于==和equals

    [重走Android之路][番外篇]关于==和equals   在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...

随机推荐

  1. C Primer Plus 第9章 函数 编程练习

    复习题: 8. int choice(int a,int b,int c){ int max; max = a; if (b > max) max = b; if (c > max) ma ...

  2. javascript中!=、!==、==、===操作符总结

    JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符. 在相等运算符中对应 === .!==和 ==.!=. 先举个栗子 var str = '1' var num0 = 0 va ...

  3. IntelliJ IDEA 2018.1.2 安装及汉化教程(附:下载地址)

    附:安装包及汉化包下载地址  链接:https://pan.baidu.com/s/1ysxtVH_gnBm0QnnqB5mluQ 密码: 9pqd 1.安装步骤: 选择安装地址:可以默认.本人安装在 ...

  4. 超越Ctrl+S保存页面所有资源

    如何抓取页面所有内容 基本需求 抓取页面所有内容主要包括一下内容: 页面内元素 页面元素包含服务端直接返回的元素,动态构建的元素 页面内所有资源 页面所有资源包含本页面所在域资源以及第三方域资源,同主 ...

  5. Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面

    一.看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url). 请求发送给服务器,服务器判断用户请求了受保护的资源. 由于用户没有登录,服务器重定向到登录页面 填 ...

  6. HTML5 CSS3 专题 :诱人的实例 3D旋转木马效果相册

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/32964301 首先说明一下创意的出处:http://www.zhangxinxu ...

  7. Windows下python3和python2同时安装python2.exe、python3.exe和pip2、pip3设置

    1.添加python2到系统环境变量 打开,控制面板\系统和安全\系统,选择高级系统设置,环境变量,选择Path,点击编辑,新建,分别添加D:\Python\python27和D:\Python\py ...

  8. redis 中如何切换db

    一台服务器上都快开启200个redis实例了,看着就崩溃了.这么做无非就是想让不同类型的数据属于不同的应用程序而彼此分开. 那么,redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的 ...

  9. java语言为什么能跨平台

    参考https://blog.csdn.net/woailuo453786790/article/details/51660015 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一 ...

  10. Go性能优化小结

    1 内存优化 1.1 小对象合并成结构体一次分配,减少内存分配次数 做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间, ...