Activity 保存狀態
1. void onCreate(Bundle savedInstanceState)
當Activity被第首次加載時執行。咱們新啓動一個程序的時候其主窗體的onCreate事件就會被執行。若是Activity被銷燬後(onDestroy後),再從新加載進Task時,其onCreate事件也會被從新執行。注意這裏的參數 savedInstanceState(Bundle類型是一個鍵值對集合,你們能夠當作是.Net中的Dictionary)是一個頗有用的設計,因爲前面已經說到的手機應用的特殊性,一個Activity極可能被強制交換到後臺(交換到後臺就是指該窗體再也不對用戶可見,但實際上又仍是存在於某個Task中的,好比一個新的Activity壓入了當前的Task從而「遮蓋」住了當前的 Activity,或者用戶按了Home鍵回到桌面,又或者其餘重要事件發生致使新的Activity出如今當前Activity之上,好比來電界面),而若是此後用戶在一段時間內沒有從新查看該窗體(Android經過長按Home鍵能夠選擇最近運行的6個程序,或者用戶直接再次點擊程序的運行圖標,若是窗體所在的Task和進程沒有被系統銷燬,則不用從新加載Process, Task和Task中的Activity,直接從新顯示Task頂部的Activity,這就稱之爲從新查看某個程序的窗體),該窗體連同其所在的Task和Process則可能已經被系統自動銷燬了,此時若是再次查看該窗體,則要從新執行 onCreate事件初始化窗體。而這個時候咱們可能但願用戶繼續上次打開該窗體時的操做狀態進行操做,而不是一切從頭開始。例如用戶在編輯短信時忽然來電,接完電話後用戶又去作了一些其餘的事情,好比保存來電號碼到聯繫人,而沒有當即回到短信編輯界面,致使了短信編輯界面被銷燬,當用戶從新進入短信程序時他可能但願繼續上次的編輯。這種狀況咱們就能夠覆寫Activity的void onSaveInstanceState(Bundle outState)事件,經過向outState中寫入一些咱們須要在窗體銷燬前保存的狀態或信息,這樣在窗體從新執行onCreate的時候,則會經過 savedInstanceState將以前保存的信息傳遞進來,此時咱們就能夠有選擇的利用這些信息來初始化窗體,而不是一切從頭開始。 2. void onStart()
onCreate事件以後執行。或者當前窗體被交換到後臺後,在用戶從新查看窗體前已通過去了一段時間,窗體已經執行了onStop事件,可是窗體和其所在進程並無被銷燬,用戶再次從新查看窗體時會執行onRestart事件,以後會跳過onCreate事件,直接執行窗體的onStart事件。 3. void onResume()
onStart事件以後執行。或者當前窗體被交換到後臺後,在用戶從新查看窗體時,窗體尚未被銷燬,也沒有執行過onStop事件(窗體還繼續存在於Task中),則會跳過窗體的onCreate和onStart事件,直接執行onResume事件。 4. void onPause()
窗體被交換到後臺時執行。
5. void onStop()
onPause事件以後執行。若是一段時間內用戶尚未從新查看該窗體,則該窗體的onStop事件將會被執行;或者用戶直接按了Back鍵,將該窗體從當前Task中移除,也會執行該窗體的onStop事件。 6. void onRestart()
onStop事件執行後,若是窗體和其所在的進程沒有被系統銷燬,此時用戶又從新查看該窗體,則會執行窗體的onRestart事件,onRestart事件後會跳過窗體的onCreate事件直接執行onStart事件。 7. void onDestroy()
Activity被銷燬的時候執行。在窗體的onStop事件以後,若是沒有再次查看該窗體,Activity則會被銷燬。
最後用一個實際的例子來講明Activity的各個生命週期。假設有一個程序由2個Activity A和B組成,A是這個程序的啓動界面。當用戶啓動程序時,Process和默認的Task分別被建立,接着A被壓入到當前的Task中,依次執行了 onCreate, onStart, onResume事件被呈現給了用戶;此時用戶選擇A中的某個功能開啓界面B,界面B被壓入當前Task遮蓋住了A,A的onPause事件執行,B的 onCreate, onStart, onResume事件執行,呈現了界面B給用戶;用戶在界面B操做完成後,使用Back鍵回到界面A,界面B再也不可見,界面B的onPause, onStop, onDestroy執行,A的onResume事件被執行,呈現界面A給用戶。此時忽然來電,界面A的onPause事件被執行,電話接聽界面被呈現給用戶,用戶接聽完電話後,又按了Home鍵回到桌面,打開另外一個程序「聯繫人」,添加了聯繫人信息又作了一些其餘的操做,此時界面A再也不可見,其 onStop事件被執行,但並無被銷燬。此後用戶從新從菜單中點擊了咱們的程序,因爲A和其所在的進程和Task並無被銷燬,A的onRestart 和onStart事件被執行,接着A的onResume事件被執行,A又被呈現給了用戶。用戶此次使用完後,按Back鍵返回到桌面,A的 onPause, onStop被執行,隨後A的onDestroy被執行,因爲當前Task中已經沒有任何Activity,A所在的Process的重要程度被降到很低,很快A所在的Process被系統結束。
當一個程序有多個activity時,按back鍵,上一個activity會退出,怎麼配備佈置能夠不退出?下次啓動它時他仍是運行的。另有就是主程序,怎麼讓他在按back鍵時自然後臺?
重寫返回按鈕事件public void onBackPressed()此方法當返回按鈕事件出發時,體系會默許調用finish(),你直接return別讓體系調用就行,back鍵後臺參考源碼home的事件並重寫
@Override
public void onBackPressed() {
// 這裏處理邏輯代碼,該方法僅適用於2.0或更新版的sdk return; }
android的手機的back鍵默認行爲是finish處於前臺的Activity的即Activity的狀態爲Destroy狀態,再次啓動該Activity是從onCreate開始的。 而Home鍵默認是stop前臺的Activity即狀態爲onStop而不是Destroy,若再次啓動它,則是從OnResume開始的,即會保持上次Activityd的狀態。 back鍵也有例外的,按back鍵不會關閉Activity的,好比播放音樂,按了back鍵以後仍能夠繼續播放音樂,這是Music這支ap已經重寫了back鍵的事件處理。 爲何須要Home鍵和Back鍵呢?一個使得Activity 爲Stop一個使得爲Destroy呢?我想緣由的緣由在因而android也是一個多任務的操做系統,經過Home鍵切換不一樣的任務,而經過back關閉任務中的某一個活動。若仔細想一想就以爲PC的多任務行爲同樣的。 詳細的解說能夠看官方文檔,也能夠看看這文章:http://www.360doc.com/content/09/1201/15/79031_10135626.shtml還有例子 注意:點擊Back鍵後,activity會先去執行finish(), 而後執行onDestroy(); 在樂phone的手機上開發應用,它的左上角有一個「返回」按鈕, 若是想在返回後把一些東西銷燬掉,能夠重寫finish()方法。
http://blog.csdn.net/sirdonker/archive/2010/06/04/5647625.aspx Android Activity導航
http://www.cnblogs.com/xirihanlin/archive/2009/08/05/1539420.html Android 保存Activity狀態
http://dev.10086.cn/cmdn/wiki/index.php?edition-view-6259-1.html (onsaceInstance)
http://cnitcastsdut.blog.163.com/blog/static/14601809320109261141571/
Android 保存Activity狀態
若是你想保存Activity的信息(例如,類實例的變量)而又不須要和其它的組件共享的話,你能夠調用Activity的getPreferences方法,不用指定一個Preference的名字。對返回的SharedPreference的訪問只限於調用的Activity;每一個Activity支持一個不命名的Shared Preference對象。
一、使用Activity的私有Shared Preference:
對於保存Activity實例的變量來講,Android提供了一種替代Shared Preference的特殊方法。
經過重寫Activity的onSaveInstanceState事件處理函數,你可使用它的Bundle參數來保存實例的值。保存數據的方法仍是使用與在Shared Preference中相同的get和put方法。在完成Bundle的修改後,將其傳入父類的處理函數中,以下面的代碼片斷所示:
private static final String TEXTVIEW_STATE_KEY = 「TEXTVIEW_STATE_KEY」; @Override
public void onSaveInstanceState(Bundle outState) { // Retrieve the View
TextView myTextView = (TextView)findViewById(R.id.myTextView);
// Save its state
outState.putString(TEXTVIEW_STATE_KEY, myTextView.getText().toString());
super.onSaveInstanceState(outState); }
二、onSaveInstanceState
/** * 保存Activity銷燬前的一些狀態信息 * @see android.app.Activity#onSaveInstanceState(android.os.Bundle) */ @Override
public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); outState.putString("fileName", fileName);
}
這個處理函數會在Activity的Active生命週期結束時觸發,但僅在它不是顯式地結束(即異常結束)。所以,它通常用於確保在單個用戶會話中的Active生命週期間Activity狀態的一致性。
若是一個會話期間,應用程序被迫重啓,那麼,保存的Bundle會傳入到onRestoreInstanceState和onCreate方法中。下面的片斷顯示瞭如何從Bundle中提取值來更新Activity實例的狀態:
@Override
public void onCreate(Bundle icicle) { super.onCreate(icicle);
setContentView(R.layout.main);
TextView myTextView = (TextView)findViewById(R.id.myTextView); String text = 「」;
if (icicle != null && icicle.containsKey(TEXTVIEW_STATE_KEY)) text = icicle.getString(TEXTVIEW_STATE_KEY); myTextView.setText(text); }
有一點很重要的是,記住onSaveInstanceState僅在Activity變成非Active狀態時調用,但不在調用finish來關閉它或用戶按下Back按鈕時調用。
Fragment 保存狀態
php
Fragment是activity的界面中的一部分或一種行爲。你能夠把多個Fragment們組合到一個activity中來建立一個多面界面而且你能夠在多個activity中重用一個Fragment。你能夠把Fragment認爲模塊化的一段activity,它具備本身的生命週期,接收它本身的事件,並能夠在activity運行時被添加或刪除。html
Fragment不能獨立存在,它必須嵌入到activity中,並且Fragment的生命週期直接受所在的activity的影響。例如:當activity暫停時,它擁有的全部的Fragment們都暫停了,當activity銷燬時,它擁有的全部Fragment們都被銷燬。然而,當activity運行時(在onResume()以後,onPause()以前),你能夠單獨地操做每一個Fragment,好比添加或刪除它們。當你在執行上述針對Fragment的事務時,你能夠將事務添加到一個棧中,這個棧被activity管理,棧中的每一條都是一個Fragment的一次事務。有了這個棧,就能夠反向執行Fragment的事務,這樣就能夠在Fragment級支持「返回」鍵(向後導航)。android
當向activity中添加一個Fragment時,它須置於ViewGroup控件中,而且需定義Fragment本身的界面。你能夠在layoutxml文件中聲明Fragment,元素爲:<fragment>;也能夠在代碼中建立Fragment,而後把它加入到ViewGroup控件中。然而,Fragment不必定非要放在activity的界面中,它能夠隱藏在後臺爲actvitiy工做。ios
接下來說如何使用fragment,包括fragment在加入activity的後退棧中時如何保持本身的狀態,如何與activity以及其它fragment們共享事件,如何顯示在activity的動做欄,等等。app
Android從3.0開始引入fragment,主要是爲了支持更動態更靈活的界面設計,好比在平板上的應用。平板機上擁有比手機更大的屏幕空間來組合和交互界面組件們。Fragment使你在作那樣的設計時,不需應付view樹中複雜的變化。經過把activity的layout分紅fragment,你能夠在activity運行時改變它的樣子,而且能夠在activity的後退棧中保存這些改變。ide
其實Fragment在SDK1.6以後就可使用了,在1.6上使用須要藉助 android-support-v4.jar包實現。android-support-v4.jar在:SDK根目錄\extras\android \compatibility\v4下能夠找到,若是想了解Fragment在SDK1.6上怎麼實現的請參考Fragment 在Android SDK1.6上實現模塊化
http://blog.csdn.net/lilu_leo/article/details/7671533這個帖子講的很清楚函數
我在項目中也碰到了不能保存Fragment狀態用到時隱藏和顯示!ui
杭州ios交流羣 372471379 杭州android交流羣:369469730spa