屏幕旋轉時Activity的生命周期 測試與結論

来源:http://www.cnblogs.com/theo/archive/2017/02/22/6428331.html
-Advertisement-
Play Games

關於 Android 手機橫豎屏切換時 Activity 的生命周期問題,網上有很多相似的文章,大多數都是說明在豎屏切換橫屏時 Activity 會重啟一次,而在橫屏切換豎屏時 Activity 會重啟兩次。 我本身不太理解這樣設計的意義,並且覺得新版本會解決這個問題,所以做了一項測試,測試環境為 ...


關於 Android 手機橫豎屏切換時 Activity 的生命周期問題,網上有很多相似的文章,大多數都是說明在豎屏切換橫屏時 Activity 會重啟一次,而在橫屏切換豎屏時 Activity 會重啟兩次。

我本身不太理解這樣設計的意義,並且覺得新版本會解決這個問題,所以做了一項測試,測試環境為 Android 7.0 模擬器。

測試

測試首先創建一個新的 Activity,併在其各個生命周期方法內列印日誌,並執行如下操作得到結果:

在 targetSdkVersion 的值大於 12 時

  1. Activity啟動

    I/System.out: onCreate
    I/System.out: onStart
    I/System.out: onResume
  2. 豎屏切換為橫屏

    I/System.out: onConfigurationChanged
    I/System.out: onPause
    I/System.out: onSaveInstanceState
    I/System.out: onStop
    I/System.out: onDestroy
    I/System.out: onCreate
    I/System.out: onStart
    I/System.out: onRestoreInstanceState
    I/System.out: onResume
  3. 橫屏切回豎屏

    I/System.out: onConfigurationChanged
    I/System.out: onPause
    I/System.out: onSaveInstanceState
    I/System.out: onStop
    I/System.out: onDestroy
    I/System.out: onCreate
    I/System.out: onStart
    I/System.out: onRestoreInstanceState
    I/System.out: onResume
  4. 配置 android:configChanges="orientation|screenSize" 後,豎屏切換為橫屏

    I/System.out: onConfigurationChanged
  5. 配置 android:configChanges="orientation|screenSize" 後,橫屏切回豎屏

    I/System.out: onConfigurationChanged

在 targetSdkVersion 的值小於或等於 12 時

  1. Activity啟動

    I/System.out: onCreate
    I/System.out: onStart
    I/System.out: onResume
  2. 豎屏切換為橫屏

    I/System.out: onConfigurationChanged
    I/System.out: onPause
    I/System.out: onSaveInstanceState
    I/System.out: onStop
    I/System.out: onDestroy
    I/System.out: onCreate
    I/System.out: onStart
    I/System.out: onRestoreInstanceState
    I/System.out: onResume
  3. 橫屏切回豎屏

    I/System.out: onConfigurationChanged
    I/System.out: onPause
    I/System.out: onSaveInstanceState
    I/System.out: onStop
    I/System.out: onDestroy
    I/System.out: onCreate
    I/System.out: onStart
    I/System.out: onRestoreInstanceState
    I/System.out: onResume
  4. 配置 android:configChanges="orientation" 後,豎屏切換為橫屏

    I/System.out: onConfigurationChanged
  5. 配置 android:configChanges="orientation" 後,橫屏切回豎屏

    I/System.out: onConfigurationChanged

總結

可以發現新版本 Android 設備上的運行結果和網上的結論並不完全相同,在橫豎屏切換時,都會調用一次 onConfigurationChanged,並重啟 Activity 一次,行為完全一致,具體的生命周期為:

I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume

在 targetSdkVersion 的值大於 12 時,配置 android:configChanges="orientation|screenSize"

在 targetSdkVersion 的值小於或等於 12 時,配置 android:configChanges="orientation"

可以做到攔截 Activity 的重新創建:

I/System.out: onConfigurationChanged

後續

將會對過去版本的 Android 設備做相應的測試,來驗證得到結果。

改進

通常研究設備旋轉帶來的 Activity 重啟問題,是為瞭解決 Activity 重啟導致成員變數未保存引發運行出錯。但之所以 Activity 會重啟是因為運行時配置發生了更變,可能有更適合的資源來匹配新的設備配置,例如在橫屏時,有更好利用空間的橫版佈局資源,這時就需要 Activity 重新載入佈局顯示。

所以,好的解決辦法是利用 onSaveInstanceState(Bundle outState) 方法保存成員變數的值到 Bundle 對象中,在 Activity 重啟後,再在 onCreate(Bundle savedInstanceState) 中獲取這些保存的信息。



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

-Advertisement-
Play Games
更多相關文章
  • 問題:上傳頭像成功後,頭像的url沒變,載入頭像時還是從緩存中根據url載入以前的圖片。 這個問題,很多人遇到過。也受到很多同行的啟發。 圖片url不變,感覺不是很合理,這樣會把緩存搞亂。 但是,作為程式員,我還是得好好想想改怎麼解決這個問題。 1.既然是緩存引起的問題,那我首先考慮的是清除緩存。 ...
  • 代理設計模式 Demo 一、讓別人幫我做事 —— 基本版 二、讓別人幫我做事 —— 引入協議 三、讓別人幫我做事 —— 規範完整版 ...
  • 由OpenDigg 出品的安卓開源項目周報第九期來啦。我們的安卓開源周報集合了OpenDigg一周來新收錄的優質的安卓開源項目,方便安卓開發人員便捷的找到自己需要的項目工具。 ...
  • 前言: 實現非同步下載apk文件 並 安裝。(進度條對話框顯示下載進度的展現方式) 涉及技術點: 1、ProgressDialog 進度條對話框 用於顯示下載進度 2、AsyncTask 非同步任務的使用 耗時操作不能再主線程中進行 安卓開發_淺談AsyncTask 3、File 文件相關操作 將文件的 ...
  • 工具 常見的反編譯工具我已經放到開源中國了,大家可以自行下載。 http://git.oschina.net/zyj1609/AndroidReverseProject 博客 這裡引用郭神的大作: Android安全攻防戰,反編譯與混淆技術完全解析(上) Android安全攻防戰,反編譯與混淆技術完 ...
  • block(代碼塊) 1.1 什麼是block block是iOS中一種比較特殊的數據類型。(可以定義變數、做形參或返回值) block是蘋果官方特別推薦使用的數據類型,應用場景比較廣泛 動畫 多線程 集合遍歷 網路請求回調 動畫 多線程 集合遍歷 網路請求回調 在多線程和網路也使用得相當頻繁,一般 ...
  • 分類 Category 分類只能給類擴充方法,不能添加屬性! Category有很多種翻譯:分類 / 類別 / 類目(一般叫分類) 分類是一個類的補充,是類的一部分。 Category的作用: 可以在不修改原來類的基礎上,為這個類擴充一些方法。(使用繼承也可以,在子類中擴充父類沒有的方法) 一個龐大 ...
  • 面向對象的三大特性: 封裝, 繼承, 多態 1. 封裝 1.1 基本概念 將零散的東西組合起來。 廣義上封裝指:將代碼封裝成函數,將實例變數和方法封裝成類,將類封裝成框架.... 面向對象中的封裝指:封裝屬性和方法放在一個對象中,只給外界公開訪問的介面,而且把具體實現隱藏起來。 1.2 封裝的好處 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...