糧草先行——Android摺疊屏開發技術點(一)

来源:https://www.cnblogs.com/wenhanxiao/archive/2019/01/30/10338109.html
-Advertisement-
Play Games

最近有關摺疊屏產品的新聞層出不窮,各家手機廠商也分別慢慢地亮出了自家的產品。然而市場上的一些APP仍然沒有很好地適配這樣的設備,顯示不正常和應用重啟的狀況時有發生。因此,我會用接下來的幾篇文章來點出有關摺疊屏開發中的一些需要註意的地方。 今天我們先來說一下 生命周期 ,這是廣大開發者特別需要註意的一 ...


最近有關摺疊屏產品的新聞層出不窮,各家手機廠商也分別慢慢地亮出了自家的產品。然而市場上的一些APP仍然沒有很好地適配這樣的設備,顯示不正常和應用重啟的狀況時有發生。因此,我會用接下來的幾篇文章來點出有關摺疊屏開發中的一些需要註意的地方。
今天我們先來說一下生命周期,這是廣大開發者特別需要註意的一點。
首先我們來看一下測試代碼:

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
    }

}

我在每一個生命周期和恢復現場的回調方法中都加了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聲明中加入相應的屬性值即可。此處,需要添加:

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
如此,我們便處理完了對於摺疊屏切換屏幕的優化。


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

-Advertisement-
Play Games
更多相關文章
  • 本文以一個簡單的小例子,簡述Android開發中GridView的常見應用,僅供學習分享使用。 ...
  • 參考文章: "約束佈局ConstraintLayout看這一篇就夠了" "ConstraintLayout 屬性篇" 介紹 Android 是谷歌推出替代 的組件。 支持相對佈局、線性佈局、幀佈局,看來更像是 、 t、`RelativeLayout·三者的結合體,並且比這三者更強大的是實現了百分比布 ...
  • 一、UIScrollView是什麼? 1、UIScrollView是滾動的view,UIView本身不能滾動,子類UIScrollview拓展了滾動方面的功能。 2、UIScrollView是所有滾動視圖的基類。以後的UITableView,UITextView等視圖都是繼承於該類。 使用場景:顯示 ...
  • 最近在項目中用到了手勢操作,鍵盤迴收時還是挺常用的,現在總結下,多謝網路上大神們的分享。 先分享下我在項目中用的代碼: 將相應代碼複製到你的工程中即可使用,由於代碼中已經有詳細的解釋說明,這裡就不在重覆解釋了。 代碼中只是列舉了單指與雙指對於單擊或多擊的處理,同理多指的操作需修改numberOfTo ...
  • 一、創建過程 二、TextView點擊事件 對比Java代碼,雖然代碼相似,可以看出Kotlin簡潔: 大大減少樣板代碼的數量。 三、kotlin知識點 😀Kotlin 程式文件以 .kt 結尾,如:hello.kt 、MainActivity.kt。 😀Android Studio 從 3.0 ...
  • 1.、首先,Controller需要實現兩個 delegate ,分別是 UITableViewDelegate 和 UITableViewDataSource2、然後 UITableView對象的 delegate要設置為 self。3、 然後就可以實現這些delegate的一些方法拉。 (1)- ...
  • 環境要求 1、運行環境 armeabi-v7a 2、系統要求 Android 5.0 (API Level 21)及以上 3、開發環境 Android Studio 下載地址:https://github.com/ArcsoftEscErd/ArcfaceDemo_Android SDK獲取地址請戳 ...
  • 轉載請標明出處,維權必究:https://www.cnblogs.com/tangZH/p/10338377.html 有時候APP需要獲取某些許可權,要讓用戶手動打開,那麼問題來了,若是直接提醒用戶出去找許可權入口,然後自己打開,用戶不一定找得到,因為現在的Android廠家定製的room五花八門,那 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...