編輯:關於android開發
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:
Android下創建一個SQLite數據庫,androidsqlite數據庫:SQLite(輕量級,嵌入式的數據庫) 大量的相似結構的數據的儲存,快速的查詢。特殊的文件(
Android中訪問sdcard路徑的幾種方式,androidsdcard以前的Android(4.1之前的版本)中,SDcard路徑通過“/sdcard”或者“/mnt
Android源碼裝飾模式---ContextWrapper 如果說Android源碼中哪個地方裝飾模式應用的最明顯的話,那肯定是非ContextWrapper莫屬了
機頂盒上gridview+ScrollView的使用。,gridviewscrollview最近在機頂盒上做一個gridview, 其焦點需要在item的子控件上,但g