日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2023/12/10 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上一篇文章中,我們有提到Activity在屏幕尺寸發(fā)生變更時(shí)的處理方式,總共有兩種:

  • 重啟APP以適應(yīng)屏幕改變;
  • 手動(dòng)處理數(shù)據(jù),避免APP重啟。
  • 同樣,這兩種方式也同時(shí)適用于改變屏幕方向、更改系統(tǒng)語(yǔ)言、甚至輸入法等等。
    因此,本文也同樣適用于改變屏幕方向等情況的處理。
    或許你會(huì)有疑問(wèn):我們?cè)撊绾芜x擇合適的處理方式呢?
    我給你的答案是:選擇最合適的。
    這么說(shuō)好像跟沒(méi)說(shuō)一樣,別急,給大家舉個(gè)例子就明白了:
    比如更改屏幕方向,由豎屏轉(zhuǎn)換為橫屏,如果我們只有一套布局,符合按比例縮放仍然顯示正常的話,我們大可以選擇第2種處理方案。但是如果我們的橫豎屏布局是不同的,比如系統(tǒng)中的“設(shè)置”應(yīng)用,那么我們選擇第2種處理方案就是不合適的。
    下圖:

    這是一個(gè)典型的橫豎屏分別采用不同布局的例子。
    我們確定要采取那種解決方案后,接下來(lái)很可能要面對(duì)另一個(gè)問(wèn)題,就是性能瓶頸。
    根據(jù)前一篇文章的實(shí)驗(yàn)結(jié)果,在發(fā)生橫豎屏切換的時(shí)候,Activity的生命周期通常會(huì)按照如下順序依次執(zhí)行:

    D/MainActivity: onPause
    D/MainActivity: onSaveInstanceState
    D/MainActivity: onStop
    D/MainActivity: onDestroy
    D/MainActivity: onCreate
    D/MainActivity: onStart
    D/MainActivity: onRestoreInstanceState
    D/MainActivity: onResume

    如果我們?cè)谏芷谥凶隽艘恍┓敝氐墓ぷ?#xff0c;那么整個(gè)Activity在重啟的過(guò)程中就會(huì)很慢。
    要解決這個(gè)問(wèn)題,首先我們要找Fragment幫忙,因?yàn)锽undle并不是用來(lái)傳遞大型對(duì)象的,而且這個(gè)對(duì)象還需要序列化和反序列化,如此執(zhí)行起來(lái)就更慢了。
    當(dāng)然,如果你只是保存一些整型或者字符串的話,單純使用Bundle而不借助Fragment也是可以的,但是這樣的場(chǎng)景在實(shí)際開發(fā)中并不常見(jiàn)。
    要借助Fragment來(lái)中轉(zhuǎn)對(duì)象,我們采用下面三步走的方式:

  • 在Fragment類中調(diào)用 setRetainInstance(true);
  • 在Activity銷毀時(shí)向Fragment類存入數(shù)據(jù);
  • 在Activity重建后根據(jù)Tag檢索Fragment,并取出之前存入的數(shù)據(jù)。
  • 下面用具體的代碼片來(lái)演示:
    首先來(lái)看Fragment類:

    public class TestFragment extends Fragment {private MyData data;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRetainInstance(true);}public void setData(MyData data) {this.data = data;}public MyData getData() {return data;} }

    我們?cè)賮?lái)看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());} }

    這里還要特別注意一點(diǎn):在中轉(zhuǎn)對(duì)象數(shù)據(jù)時(shí),不要傳入與Activity緊密相關(guān)的對(duì)象,比如View,否則會(huì)造成內(nèi)存泄漏。
    至此,就完成了對(duì)重啟Activity方案的性能優(yōu)化。

    轉(zhuǎn)載于:https://www.cnblogs.com/wenhanxiao/p/10373717.html

    總結(jié)

    以上是生活随笔為你收集整理的粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。