編輯:關於Android編程
1.onPause()
(1)當半透明Activity阻擋您的Activity時,系統會調用 onPause() 並且Activity會在“暫停”狀態下等待 。 如果用戶在Activity仍然處於暫停狀態時返回Activity,則系統會調用 onResume()。
(2)當系統為您的Activity調用 onPause() 時,它從技術角度看意味著您的Activity仍然處於部分可見狀態,但往往說明用戶即將離開Activity並且它很快就要進入“停止”狀態。您通常應使用 onPause() 回調:
1>停止動畫或其他可能消耗 CPU 的進行之中的操作。
2>提交未保存的更改,但僅當用戶離開時希望永久性保存此類更改(比如電子郵件草稿)。
3>釋放系統資源,比如廣播接收器、傳感器手柄(比如 GPS) 或當您的Activity暫停且用戶不需要它們時仍然可能影響電池壽命的任何其他資源。
例如,如果您的應用使用 Camera, onPause() 方法是釋放它的好位置。
@Override public void onPause() { super.onPause(); // Always call thesuperclass method first // Releasethe Camera because we don't need it when paused // andother activities might need to use it. if(mCamera != null) { mCamera.release() mCamera = null; } }
(3)一般情況下,您不得使用 onPause() 永久性存儲用戶更改(比如輸入表格的個人信息)。 只有在您確定用戶希望自動保存這些更改的情況(比如,電子郵件草稿)下,才能在 onPause()中永久性存儲用戶更改。但您應避免在 onPause() 期間執行 CPU 密集型工作,比如向數據庫寫入信息,因為這會拖慢向下一Activity過渡的過程(您應改為在 onStop()期間執行高負載關機操作。
(4)當您的Activity暫停時,Activity 實例將駐留在內存中並且在Activity繼續時被再次調用。您無需重新初始化在執行任何導致進入“OnResume()”狀態的回調方法期間創建的組件。
2.onResume()
每當您的Activity進入前台時系統便會調用此方法,包括它初次創建之時。同樣地,您應實現onResume() 初始化您在 onPause() 期間釋放的組件並且執行每當Activity進入“繼續”狀態時必須進行的任何其他初始化操作(比如開始動畫和初始化只在Activity具有用戶焦點時使用的組件)。onResume() 的以下示例對應於以上的 onPause() 示例,因此它初始化Activity暫停時釋放的照相機。
@Override publicvoid onResume() { super.onResume(); // Always call the superclass method first // Get the Camera instance as the activityachieves full user focus if (mCamera == null) { initializeCamera(); // Local method tohandle camera init } }
3.onStop() 和 onRestart()
(1)正確停止和重新開始Activity是Activity生命周期中的重要過程,其可確保您的用戶知曉應用始終保持Activity狀態並且不會丟失進度。有幾種Activity停止和重新開始的關鍵場景:
1>用戶打開“最近應用”窗口並從您的應用切換到另一個應用。當前位於前台的您的應用中的Activity將停止。 如果用戶從主屏幕啟動器圖標或“最近應用”窗口返回到您的應用,Activity會重新開始。
2>用戶在您的應用中執行開始新Activity的操作。當第二個Activity創建好後,當前Activity便停止。 如果用戶之後按了返回按鈕,第一個Activity會重新開始。
3>用戶在其手機上使用您的應用的同時接聽來電。
(2)因為系統在停止時會將您的 Activity 實例保留在系統內存中,您根本無需實onStop() 和 onRestart()或甚至onStart() 方法。對於大多數相對簡單的Activity而言, Activity將停止並重新開始,並且您可能只需使用 onPause() 暫停正在進行的操作,
並從系統資源斷開連接。
(3)用戶離開Activity時,系統會調用 onStop() 停止Activity。 如果用戶在Activity停止時返回,系統會調用 onRestart() ,緊接著調用 onStart() 和 onResume() 。 注意:無論什麼場景導致Activity停止,系統始終會在調用 onStop() 之前調用onPause()。
(4)onStop()
當您的Activity收到 onStop() 方法的調用時,它不再可見,並且應釋放幾乎所有用戶不使用時不需要的資源。一旦您的Activity停止,如果需要恢復系統內存,系統可能會銷毀該實例。在極端情況下,系統可能會僅終止應用進程,而不會調用Activity的最終 onDestroy() 回調,因此您使用 onStop() 釋放可能洩露內存的資源非常重要。盡管 onPause() 方法在 onStop()之前調用,您應使用 onStop() 執行更大、占用更多 CPU 的關閉操作,比如向數據庫寫入信息。
例如,此處是將草稿筆記內容保存在永久存儲中的 onStop() 的實現:
@Override protectedvoid onStop() { super.onStop(); // Always call the superclass method first // Save the note's current draft, becausethe activity is stopping // and we want to be sure the current noteprogress isn't lost. ContentValues values = new ContentValues(); values.put(NotePad.Notes.COLUMN_NAME_NOTE,getCurrentNoteText()); values.put(NotePad.Notes.COLUMN_NAME_TITLE,getCurrentNoteTitle()); getContentResolver().update( mUri, // The URI for the note to update. values,// The map of column names and new values to apply to them. null, // No SELECT criteria are used. null // No WHERE columns are used. ); }
當您的Activity停止時, Activity 對象將駐留在內存中並在Activity繼續時被再次調用。 您無需重新初始化在任何導致進入“繼續”狀態的回調方法過程中創建的組件。 系統還會在布局中跟蹤每個 View 的當前狀態,如果用戶在 EditText 小工具中輸入文本,該內容會保留,因此您無需保存即可恢復它。
4.onStart() / onRestart()
當您的Activity從停止狀態返回前台時,它會接收對 onRestart() 的調用。系統還會在每次您的Activity變為可見時調用 onStart() 方法(無論是正重新開始還是初次創建)。但是,只會在Activity從停止狀態繼續時調用 onRestart() 方法,因此您可以使用它執行只有在Activity之前停止但未銷毀的情況下可能必須執行的特殊恢復工作。應用需要使用 onRestart() 恢復Activity狀態的情況並不常見,因此沒有適用於一般應用群體的任何方法指導原則。但是,因為您的 onStop() 方法應基本清理所有Activity的資源,您將需要在Activity重新開始時重新實例化它們。但是,您還需要在您的Activity初次創建時重新實例化它們(沒有Activity的現有實例)。出於此原因,您應經常使用 onStart() 回調方法作為 onStop() 方法的對應部分,因為系統會在它創建您的Activity以及從停止狀態重新開始Activity時調用 onStart() 。
例如,因為用戶可能在回到它之前已離開應用很長時間, onStart() 方法是確認所需系統功能已啟動的理想選擇:
@Override protectedvoid onStop() { super.onStop(); // Always call the superclass method first // Save the note's current draft, becausethe activity is stopping // and we want to be sure the current noteprogress isn't lost. ContentValues values = new ContentValues(); values.put(NotePad.Notes.COLUMN_NAME_NOTE,getCurrentNoteText()); values.put(NotePad.Notes.COLUMN_NAME_TITLE,getCurrentNoteTitle()); getContentResolver().update( mUri, // The URI for the note to update. values,// The map of column names and new values to apply to them. null, // No SELECT criteria are used. null // No WHERE columns are used. ); }
當系統銷毀您的Activity時,它會調用您的 Activity 的 onDestroy() 方法。因為您通常應已使用 onStop() 釋放大多數您的資源,到您接收對 onDestroy() 的調用時,大多數應用無需做太多操作。此方法是您清理可導致內存洩露的資源的最後一種方法,因
此您應確保其他線程被銷毀且其他長期運行的操作(比如方法跟蹤)也會停止。
5.Recreating an Activity
如果Activity當前被停止或長期未使用,或者前台Activity需要更多資源以致系統必須關閉後台進程恢復內存,系統也可能會銷毀Activity。
當您的Activity因用戶按了返回或Activity自行完成而被銷毀時,系統的 Activity 實例概念將永久消失,因為行為指示不再需要Activity。 但是,如果系統因系統局限性(而非正常應用行為)而銷毀Activity,盡管 Activity 實際實例已不在,系統會記住其存在,這樣,如果用戶導航回實例,系統會使用描述Activity被銷毀時狀態的一組已保存數據創建Activity的新實例。 系統用於恢復先前狀態的已保存數據被稱為“實例狀態”,並且是 Bundle 對象中存儲的鍵值對集合。注意:每次用戶旋轉屏幕時,您的Activity將被銷毀並重新創建。 當屏幕方向變化時,系統會銷毀並重新創建前台Activity,因為屏幕配置已更改並且您的Activity可能需要加載備用資源(比如布局)。為了 Android 系統恢復Activity中視圖的狀態,每個視圖必須具有 android:id 屬性提供的唯一 ID。
要保存有關Activity狀態的其他數據,您必須替代 onSaveInstanceState() 回調方法。當用戶要離開Activity並在Activity意外銷毀時向其傳遞將保存的 Bundle 對象時,系統會調用此方法。如果系統必須稍後重新創建Activity實例,它會將相同的 Bundle 對象同時傳遞給 onRestoreInstanceState() 和 onCreate() 方法。當系統開始停止您的Activity時,它會 調onSaveInstanceState(),因此,您可以指定您希望在 Activity 實例必須重新創建時保存的額外狀態數據。如果Activity被銷毀且必須重新創建相同的實例,系統將在中定義的狀態數據同時傳遞給 onCreate() 方法和onRestoreInstanceState() 方法。
(1) 保存Activity狀態
當您的Activity開始停止時,系統會調用 onSaveInstanceState() 以便您的Activity可以保存帶有鍵值對集合的狀態信息。此方法的默認實現保存有關Activity視圖層次的狀態信息,例如 EditText 小工具中的文本或ListView 的滾動位置。要保存Activity的更多狀態信息,您必須實現 onSaveInstanceState() 並將鍵值對添加至 Bundle 對象。 例如:
static final String STATE_SCORE ="playerScore"; static final String STATE_LEVEL ="playerLevel"; ... @Override public voidonSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putInt(STATE_SCORE, mCurrentScore); savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); }
注意:始終調用onSaveInstanceState() 的超類實現,以便默認實現可以保存視圖層次的狀態。
(2) 恢復Activity狀態
當您的Activity在先前銷毀之後重新創建時,您可以從系統向Activity傳遞的 Bundle 恢復已保存的狀態。onCreate() 和onRestoreInstanceState() 回調方法均接收包含實例狀態信息的相同 Bundle。因為無論系統正在創建Activity的新實例還是重新創建先前的實例,都會調用 onCreate() 方法,因此您必須在嘗試讀取它之前檢查狀態 Bundle 是否為 null。 如果為 null,則系統將創建Activity的新實例,而不是恢復已銷毀的先前實例。
例如,此處顯示您如何可以在onCreate() 中恢復一些狀態數據:
@Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); // Always call the superclass first // Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from savedstate mCurrentScore =savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // Probably initialize members withdefault values for a new instance } ... }
您可以選擇實現系統在onStart() 方法之後調用的onRestoreInstanceState() ,而不是在onCreate() 期間恢復狀態。 系統只在存在要恢復的已保存狀態時調用 onRestoreInstanceState() ,因此您無需檢查 Bundle 是否為 null:
public voidonRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState(savedInstanceState); // Restore state members from saved instance mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }
注意:始終調用onSaveInstanceState() 的超類實現,以便默認實現可以恢復視圖層次的狀態。
(3)onSaveInstanceState:
1>在Activity被覆蓋或退居後台之後,系統資源不足將其殺死,此方法會被調用;
2>在用戶改變屏幕方向時,此方法會被調用;
3>在當前Activity跳轉到其他Activity或者按Home鍵回到主屏,自身退居後台時,此方法會被調用。
第一種情況我們無法保證什麼時候發生,系統根據資源緊張程度去調度;第二種是屏幕翻轉方向時,系統先銷毀當前的Activity,然後再重建一個新的,調用此方法時,我們可以保存一些臨時數據;第三種情況系統調用此方法是為了保存當前窗口各個View組件的狀態onSaveInstanceState的調用順序是在onPause之前後(Android3.0之前是在onPause之前,之後是在onPause之後)。
(4)onRestoreInstanceState:
1>在Activity被覆蓋或退居後台之後,系統資源不足將其殺死,然後用戶又回到了此Activity,此方法會被調用;
2>在用戶改變屏幕方向時,重建的過程中,此方法會被調用。我們可以重寫此方法,以便可以恢復一些臨時數據。
onRestoreInstanceState的調用順序是在onStart之後。
關於Android中launchMode的文章介紹的真心不少,廣為流傳而且介紹的最詳細的莫過於這篇文章http://blog.csdn.net/android_tutor
今天我們就簡單的實現一下城市的排序 讀取我們城市的信息並通過listview展示 首先看一下我們的布局文件 <LinearLayout xmlns:and
最近學習了五子棋的課程,感覺挺不錯。然後自己寫了個關於五子棋的android程序,從中還是能夠學習到很多東西的。現在我們開始今天五子棋程序的編寫歷程。程序的源碼請參見友情
今天主要添加了一個換膚的功能,可以切換6種不同的背景,即點擊“換膚”按鈕可以實現切換背景圖片。 這個我在網上搜了好長時間,最終最靠譜和好理解的應該是下面這個鏈接裡的方法: