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