糧草先行——Android摺疊屏開發技術點番外篇之運行時變更處理原則

来源:https://www.cnblogs.com/wenhanxiao/archive/2019/02/14/10373717.html
-Advertisement-
Play Games

上一篇文章中,我們有提到Activity在屏幕尺寸發生變更時的處理方式,總共有兩種: 1. 重啟APP以適應屏幕改變; 2. 手動處理數據,避免APP重啟。 同樣,這兩種方式也同時適用於改變屏幕方向、更改系統語言、甚至輸入法等等。 因此,本文也同樣 適用於改變屏幕方向等情況的處理。 或許你會有疑問: ...


上一篇文章中,我們有提到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方案的性能優化。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概述 Oralce中的任務有2種:Job和Dbms_job,兩者的區別有: 1. jobs是oracle資料庫的對象, dbms_jobs只是jobs對象的一個實例, 就像對於tables, emp和dept都是表的實例。 2. 創建方式也有差異,Job是通過調用dbms_scheduler.c ...
  • [20190214]11g Query Result Cache RC Latches補充.txt--//上午測試鏈接:http://blog.itpub.net/267265/viewspace-2632907/--//發現自己的一個錯誤,另外寫一篇帖子更正.--//順便複習result cach ...
  • CHARINDEX作用 寫SQL語句我們經常需要判斷一個字元串中是否包含另一個字元串,但是SQL SERVER中並沒有像C#提供了Contains函數,不過SQL SERVER中提供了一個叫CHAEINDX的函數,顧名思義就是找到字元(char)的位置(index),既然能夠知道所在的位置,當然就可 ...
  • 以下幾種方法可供選擇 第一種方式: 最簡單的方法就是藉助第三方工具Navicat for MySQL來修改,方法如下: 1、登錄mysql到指定庫,如:登錄到test庫。 2、然後點擊上方“用戶”按鈕。 3、選擇要更改的用戶名,然後點擊上方的“編輯用戶”按鈕。 4、出現如圖界面,輸入新密碼,並確認新 ...
  • [20190214]11g Query Result Cache RC Latches.txt--//昨天我重覆鏈接http://www.pythian.com/blog/oracle-11g-query-result-cache-rc-latches/的測試,--//按照我的理解如果sql語句密集 ...
  • 2019-02-14 05:13:09 WARNING OGG-01519 Waiting at EOF on input trail file /home/u01/app/ogg/dirdat/MB000000002, which is not marked as complete; but su ...
  • 一、概述 1)隊列用來存儲代碼任務,線程用來運行代碼任務; 2)main()函數作為程式入口,整個程式預設運行在主線程中,程式代碼任務預設存放在主隊列中; 3)以下所謂阻塞線程是針對主線程而言(子線程阻塞在所不問,自己手動管理);隊列阻塞主要是針對主隊列(子隊列阻塞在所不問,自己手動管理); 4)在 ...
  • 功能描述:彈出鍵盤,右邊有最大化按鈕,沒有最大化的時候最大行數為3,預設1行,隨著文字輸入增加自動增加高度,到達3行時不會在增加,點擊最大化輸入框,行數無限制,輸入框下方圖片點擊刪除 此處為了簡便,鍵盤監聽用了一個庫,如果自己寫也簡單,直接 addOnGlobalLayoutListener 便可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...