粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则
上一篇文章中,我們有提到Activity在屏幕尺寸發生變更時的處理方式,總共有兩種:
同樣,這兩種方式也同時適用于改變屏幕方向、更改系統語言、甚至輸入法等等。
 因此,本文也同樣適用于改變屏幕方向等情況的處理。
 或許你會有疑問:我們該如何選擇合適的處理方式呢?
 我給你的答案是:選擇最合適的。
 這么說好像跟沒說一樣,別急,給大家舉個例子就明白了:
 比如更改屏幕方向,由豎屏轉換為橫屏,如果我們只有一套布局,符合按比例縮放仍然顯示正常的話,我們大可以選擇第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來中轉對象,我們采用下面三步走的方式:
下面用具體的代碼片來演示:
 首先來看Fragment類:
我們再來看Activity類:
public class MyActivity extends Activity {private TestFragment mTestFragment ;@Overridepublic 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());}}@Overridepublic void onDestroy() {super.onDestroy();mTestFragment.setData(saveData());} }這里還要特別注意一點:在中轉對象數據時,不要傳入與Activity緊密相關的對象,比如View,否則會造成內存泄漏。
 至此,就完成了對重啟Activity方案的性能優化。
轉載于:https://www.cnblogs.com/wenhanxiao/p/10373717.html
總結
以上是生活随笔為你收集整理的粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 冯氏集团于进博会发布报告,分析影响全球服
- 下一篇: 黑马程序员全套Java教程_Java基础
