Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Activity生命周期,activity生命周期圖

Activity生命周期,activity生命周期圖

編輯:關於android開發

Activity生命周期,activity生命周期圖


在開始之前我們先了解一下什麼是Activity:

         Activity活動,理解為手機屏幕,與用戶的可視化界面;Activity存儲在Activity棧中,後進先出

   1. onPause()和onStop()被調用的前提是: 打開了一個新的Activity!而前者是舊Activity還可見的狀態;後者是舊Activity已經不可見!

   2. 另外,親測:AlertDialog和PopWindow是不會觸發上述兩個回調方法的!

接下來我們就來詳細說一說這幾個過程。

但是知道這些還不夠,我們必須親自試驗一下才能深刻體會,融會貫通。

 

  1 package com.liuxianglin.demo
  2  
  3 import android.app.Activity;  
  4 import android.content.Context;  
  5 import android.content.Intent;  
  6 import android.os.Bundle;  
  7 import android.util.Log;  
  8 import android.view.View;  
  9 import android.widget.Button;  
 10   
 11 public class LifeCycleActivity extends Activity {  
 12       
 13     private static final String TAG = "LifeCycleActivity";  
 14     private Context context = this;  
 15     private int param = 1;  
 16       
 17     //Activity創建時被調用  
 18     @Override  
 19     public void onCreate(Bundle savedInstanceState) {  
 20         super.onCreate(savedInstanceState);  
 21         Log.i(TAG, "onCreate called.");  
 22           
 23         setContentView(R.layout.lifecycle);  
 24           
 25         Button btn = (Button) findViewById(R.id.btn);  
 26         btn.setOnClickListener(new View.OnClickListener() {  
 27             @Override  
 28             public void onClick(View v) {  
 29                 Intent intent = new Intent(context, TargetActivity.class);  
 30                 startActivity(intent);  
 31             }  
 32         });  
 33     }  
 34       
 35     //Activity創建或者從後台重新回到前台時被調用  
 36     @Override  
 37     protected void onStart() {  
 38         super.onStart();  
 39         Log.i(TAG, "onStart called.");  
 40     }  
 41       
 42     //Activity從後台重新回到前台時被調用  
 43     @Override  
 44     protected void onRestart() {  
 45         super.onRestart();  
 46         Log.i(TAG, "onRestart called.");  
 47     }  
 48       
 49     //Activity創建或者從被覆蓋、後台重新回到前台時被調用  
 50     @Override  
 51     protected void onResume() {  
 52         super.onResume();  
 53         Log.i(TAG, "onResume called.");  
 54     }  
 55       
 56     //Activity窗口獲得或失去焦點時被調用,在onResume之後或onPause之後  
 57     /*@Override 
 58     public void onWindowFocusChanged(boolean hasFocus) { 
 59         super.onWindowFocusChanged(hasFocus); 
 60         Log.i(TAG, "onWindowFocusChanged called."); 
 61     }*/  
 62       
 63     //Activity被覆蓋到下面或者鎖屏時被調用  
 64     @Override  
 65     protected void onPause() {  
 66         super.onPause();  
 67         Log.i(TAG, "onPause called.");  
 68         //有可能在執行完onPause或onStop後,系統資源緊張將Activity殺死,所以有必要在此保存持久數據  
 69     }  
 70       
 71     //退出當前Activity或者跳轉到新Activity時被調用  
 72     @Override  
 73     protected void onStop() {  
 74         super.onStop();  
 75         Log.i(TAG, "onStop called.");     
 76     }  
 77       
 78     //退出當前Activity時被調用,調用之後Activity就結束了  
 79     @Override  
 80     protected void onDestroy() {  
 81         super.onDestroy();  
 82         Log.i(TAG, "onDestory called.");  
 83     }  
 84       
 85     /** 
 86      * Activity被系統殺死時被調用. 
 87      * 例如:屏幕方向改變時,Activity被銷毀再重建;當前Activity處於後台,系統資源緊張將其殺死. 
 88      * 另外,當跳轉到其他Activity或者按Home鍵回到主屏時該方法也會被調用,系統是為了保存當前View組件的狀態. 
 89      * 在onPause之前被調用. 
 90      */  
 91     @Override  
 92     protected void onSaveInstanceState(Bundle outState) {  
 93         outState.putInt("param", param);  
 94         Log.i(TAG, "onSaveInstanceState called. put param: " + param);  
 95         super.onSaveInstanceState(outState);  
 96     }  
 97       
 98     /** 
 99      * Activity被系統殺死後再重建時被調用. 
100      * 例如:屏幕方向改變時,Activity被銷毀再重建;當前Activity處於後台,系統資源緊張將其殺死,用戶又啟動該Activity. 
101      * 這兩種情況下onRestoreInstanceState都會被調用,在onStart之後. 
102      */  
103     @Override  
104     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
105         param = savedInstanceState.getInt("param");  
106         Log.i(TAG, "onRestoreInstanceState called. get param: " + param);  
107         super.onRestoreInstanceState(savedInstanceState);  
108     }  
109 }  

除了幾個常見的方法外,還添加了onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState方法:
1.onWindowFocusChanged方法:在Activity窗口獲得或失去焦點時被調用,例如創建時首次呈現在用戶面前;當前Activity被其他Activity覆蓋;當前Activity轉到其他Activity或按Home鍵回到主屏,自身退居後台;用戶退出當前Activity。以上幾種情況都會調用onWindowFocusChanged,並且當Activity被創建時是在onResume之後被調用,當Activity被覆蓋或者退居後台或者當前Activity退出時,它是在onPause之後被調用。

這個方法在某種場合下還是很有用的,例如程序啟動時想要獲取視特定視圖組件的尺寸大小,在onCreate中可能無法取到,因為窗口Window對象還沒創建完成,這個時候我們就需要在onWindowFocusChanged裡獲取;如果大家已經看過我寫的Android動畫之Frame Animation這篇文章就會知道,當時試圖在onCreate裡加載frame動畫失敗的原因就是因為窗口Window對象沒有初始化完成,所以最後我將加載動畫的代碼放到了onWindowFocusChanged中,問題迎刃而解。不過大家也許會有疑惑,為什麼我在代碼裡將它注釋掉了,因為對當前Activity每一個操作都有它的執行log,我擔心這會影響到整個流程的清晰度,所以將它注掉,大家只要了解它應用的場合和執行的順序就可以了。

2.onSaveInstanceState:

第一種情況我們無法保證什麼時候發生,系統根據資源緊張程度去調度;

第二種是屏幕翻轉方向時,系統先銷毀當前的Activity,然後再重建一個新的,調用此方法時,我們可以保存一些臨時數據;

第三種情況系統調用此方法是為了保存當前窗口各個View組件的狀態。onSaveInstanceState的調用順序是在onPause之前。

3.onRestoreInstanceState:

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved