1. 程式人生 > >安卓效能優化之Activity和Fragment通過onSaveInstanceState()儲存和恢復資料

安卓效能優化之Activity和Fragment通過onSaveInstanceState()儲存和恢復資料

Activity和Fragment 都有自己的生命週期,而且很類似.Fragment比Activity多了onAttach()和onCreateView()這些方法.整體它們兩者是一樣的週期,都會經歷從建立檢視( onCreate(),onCreateView(),onStart() )到暫停( onPause(), onStop() ) 到重新返回( onResume() ) 到最後銷燬( onDetroyView(), onDestroy() ) 這些方法.

 之前有提過,熟悉元件的這些生命週期對我們在適當時候儲存資料非常有利,我們能在Activity或者Fragment被系統或者我們自己人為清理前對必要的資料進行處理和儲存,下次就能再使用這些資料,對使用者而言這絕對是一件好事兒~ 

首先看一個步驟,如果是人為關閉Activity或者Fragment, 比如點選了後退鍵,主動關閉當前頁面,就會走 onPause() --> onStop()  --> onDestroy()  而onSaveInstanceState() 並不會被呼叫. onSaveInstanceState() 只有在系統即將要自動清理銷燬Activity或Fragment前才會呼叫, 比如 

1, 由於重力感應 手機從豎屏變為橫屏, 

2, 手機點選Home鍵和長按Home鍵

3, 點選電源鍵鎖屏時

4, 從當前Activity跳到另一個Activity

5, 應用記憶體不足即將自動銷燬時等情況

 綜合上面的情況,可以看出, onSaveInstanceState()  這個方法適合臨時儲存一些非永久性的資料.如果要持久化儲存資料,就要將操作放在onStop(), onDestroy()這些方法中去.onSaveInstanceState() 適合的是當前Activity或者Fragment一旦被系統自己銷燬,應用還能在這之前儲存一些必要的資料, 並且使用者的操作很快又回到當前這個頁面,這個時候資料並沒有丟失,還能最大程度的恢復之前狀態.這就是這個方法最大的意義.下面上例子做個簡單示例:

在Fragment中

//系統自動銷燬Fragment前儲存必要的資料
@Override
public void onSaveInstanceState(Bundle outState){
   super.onSaveInstanceState(outState);
   String content = etCon.getText().toString();
   outState.putString("inputCon", content);
}
	
//恢復資料
@Override
public void onViewStateRestored(Bundle savedInstanceState){
   super.onViewStateRestored(savedInstanceState);
   //恢復之前輸入框的內容
   if(savedInstanceState != null){
      etCon.setText(savedInstanceState.getString("inputCon", ""));
   }
}

在Activity中

//系統自動銷燬Activity前儲存必要的資料
@Override
public void onSaveInstanceState(Bundle outState){
   super.onSaveInstanceState(outState);
   String content = etCon.getText().toString();
   outState.putString("inputCon", content);
}
	
//Activity中可在onRestoreInstanceState()方法恢復資料,也可以在onCreate()中恢復,因為Activity一旦被銷燬就會重走一次onCreate()開始的正常生命週期
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
   super.onRestoreInstanceState(savedInstanceState);
   //恢復之前輸入框的內容
   if(savedInstanceState != null){
      etCon.setText(savedInstanceState.getString("inputCon", ""));
   }
}
	
@Override
public void onDestroy(){
   super.onDestroy();
   //Activity被銷燬前可進行最後一次資料的儲存,過了這村就沒這店了.
}

這裡有個重要的點,上面的上面所提及的onSaveInstanceState()方法只有在Activity或Fragment確定要被系統自動清除時,才會被呼叫,如果不是長期後臺應用,頁面沒有被系統kill掉,對應的Activity或Fragment也就不會呼叫onSaveInstanceState()這些方法.

相關推薦

效能優化ActivityFragment通過onSaveInstanceState()儲存恢復資料

Activity和Fragment 都有自己的生命週期,而且很類似.Fragment比Activity多了onAttach()和onCreateView()這些方法.整體它們兩者是一樣的週期,都會經歷從建立檢視( onCreate(),onCreateView(),onSt

效能優化懶載入(View的懶載入)

1、背景:為什麼需要View的懶載入。           我們在做安卓專案的時候,經常會有一個使用場景:需要在執行時根據資料動態決定顯示或隱藏某個View和佈局。       上述場景,我們通常的解決方案就是:就是把可能用到的View先寫在佈局裡,再初始化其可見性都設為

四大元件 Activity 任務棧回收棧(Tasks and Back Stack)

本文摘要 |---Saving Activity State   |---Managing Tasks     |---Defining launch modes     |---Handling affinities     |---Clearing the back s

四大元件Activity學習

在安卓中各大控制元件都要依附Activity來完成與使用者的互動,Activity(活動)作為控制元件的平臺。介面的實現都要用到Activity,簡單的說Activity就是安卓的UI部分。 Activity的生命週期 一個Activity的建立與銷燬要經歷一下幾個方法: onCreat

專案實戰關於獲取SD卡指定路徑檔案的講解

前言 當我們將手機連線到電腦上時,我們發現在SD卡的根目錄下生成了成百上千的由各種應用程式建立的資料夾,導致我們也不知道哪個資料夾是用來幹嘛的,這正因為這樣安卓開發人員經常受到使用者的吐槽。 的確作為一個安卓開發者,我們的確不應該將我們應用的資料直接存到SD卡的根目錄下,這樣當手機安

專案實戰Activity啟動過程中動態獲取元件寬高的3種方式

前言 有時候我們需要在Activity啟動的時候獲取某一元件的寬或者是高用於動態的更改UI佈局,但是這時候我們直接通過getWidth和getHeight方法獲取是有問題的,如下: 我們在Activity的onCreate方法中呼叫如下的方法來獲取元件的寬高: /** * 在onC

API指南Activity回顧

本系列的文章全部為學習摘要,不偏重各種細節展示,更多的是安卓體系重要節點的羅列,並適時加入少量自己的理解分析,以便能快速的回顧安卓體系結構和那些重要的技術點。 每個 Activity 都會獲得一個用於繪製其使用者介面的視窗。視窗通常會充滿螢幕,但也可小於螢幕並浮動在其他

記憶體洩漏與排查流程——效能優化

前言 記憶體洩漏可以說是安卓開發中常遇到的問題,追溯和排查其問題根源是進階的程式猿必須具備的一項技能。小盆友今天便與大家分享一下這方面的一些見解,如有理解錯誤或是不同見解,可以於評論區留言我們進行討論,如果喜歡給個贊鼓勵下吧。 篇幅較長,可以通過目錄尋找自己所需瞭解的吧 目錄 1、JAVA記

Android效能優化 App啟動原理分析及速度時間優化

應用的啟動速度緩慢這是很多開發者都遇到的一個問題,比如啟動緩慢導致的黑屏,白屏問題,大部分的答案都是做一個透明的主題,或者是做一個Splash介面,但是這並沒有從根本上解決這個問題。那麼如何從根本上解決這個問題或者做到一定程度的緩解? 一、應用的啟動方式 1、冷啟動:

效能優化—佈局優化

效能優化是開發中必不可少的,大概可以從記憶體、佈局以及app啟動時間等方面進行優化,本篇文章介紹一些佈局優化的方法; A RelativeLayout is a very powerful utility for designing a user in

專案實戰設定Activity跳轉動畫的5種實現方式

前言 在介紹activity的切換動畫之前我們先來說明一下實現切換activity的兩種方式: 1,呼叫startActivity方法啟動一個新的Activity並跳轉其頁面 2,呼叫finish方法銷燬當前的Activity返回上一個Activity介面 當呼叫startActiv

專案實戰強大的網路請求框架okGo使用詳解(六):擴充套件專案okServer,更強大的下載上傳功能,支援斷點多工管理

OkGo與OkDownload的區別就是,OkGo只是簡單的做一個下載功能,不具備斷點下載,暫停等操作,但是這在很多時候已經能滿足需要了。 而有些app需要有一個下載列表的功能,就像迅雷下載一樣,每個下載任務可以暫停,可以繼續,可以重新下載,可以有下載優先順序,這時候OkDownload就有

API指南Fragment回顧

本系列的文章全部為學習摘要,不偏重各種細節展示,更多的是安卓體系重要節點的羅列,並適時加入少量自己的理解分析,以便能快速的回顧安卓體系結構和那些重要的技術點。 片段Fragment必須始終嵌入在 Activity 中,其生命週期直接受宿主 Activity 生命週期的影

API指南Intent Intent 過濾器

本系列的文章全部為學習摘要,不偏重各種細節展示,更多的是安卓體系重要節點的羅列,並適時加入少量自己的理解分析,以便能快速的回顧安卓體系結構和那些重要的技術點。 Intent 是一個訊息傳遞物件,您可以使用它從其他應用元件請求操作。儘管 Intent 可以通過多種方式促進

專案實戰7.0優化下的全域性網路連線狀態監聽

須知:Android7.0起網路變化監聽隱式廣播被關閉 在 Android 7.0 版本中除了提供諸多多視窗支援、活動通知、後臺優化、訊息傳遞服務和Vulkan 等新特性和功能外,還對系統和 API 行為做出了各種變更,其中最重要的一點:Android7.0為了進行後臺的優化刪除了三

SQLPL/SQL的效能優化二--執行計劃管理

1、提示--它們僅是建議,優化器可以選擇忽略他們。事實上,優化器將盡可能地遵從優化提示,哪怕會導致空難性的效能影響。一般來說,只有當你用盡非直接方法(收集統計資訊,建立柱狀圖及設定配置引數等)之後,才可以考慮使用提示。     下面是一些更常見的提示:  

前端效能優化重排重繪

前言,最近利用碎片時間拜讀了一下尼古拉斯的另一鉅作《高效能JavaScript》,今天寫的文章從“老生常談”的頁面重繪和重排入手,去探究這兩個概念在頁面效能提升上的作用。 一.重排 & 重繪 有經驗的大佬對這個概念一定不會陌生,“瀏覽器輸入URL發生了什麼”。估計大家已經爛熟於

SQLPL/SQL的效能優化三--表訪問調優

1、一般來說,在where子句的條件選擇性不是很高時,全表掃描是最合適的檢索路徑,而在條件選擇很高時,索引或聚簇方法將更合適。      就IO而言,無論記錄多大,每個索引訪問的開銷幾乎都是相同的,然而,記錄越長,全表掃描必須讀取的資料塊就越多。 &nbs

專案實戰通用的PopupWindow封裝使用

如何使用 1:背景變暗配置示例: //建立並顯示popWindow mCustomPopWindow= new CustomPopWindow.PopupWindowBuilder(this) .setView(

學習筆記Fragment.

一套類似手機QQ的介面 1。現在activity_main.xml中使用一個如果做動態新增就不要在裡面寫任何內容在後面的子碎片中編寫。如果做靜態就可以直接在裡面寫。緊接著把剛進入時的主介面設計在這個xml中。 2.然後開始分 別建立對應的子佈局建幾個根據你所做的