Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)...
一、什么是Activity?
??? 簡單的說:Activity或者懸浮于其它窗體上的交互界面。
在一個應用程序中通常由多個Activity構成。都會在Manifest.xml中指定一個主的Activity,例如以下設置
<actionandroid:name="android.intent.action.MAIN" />
當程序第一次執行時用戶就會看這個Activity,這個Activity能夠通過啟動其它的Activity進行相關操作。當啟動其它的Activity時這個當前的這個Activity將會停止,新的Activity將會壓入棧中,同一時候獲取用戶焦點,這時就可在這個Activity上操作了。都知道棧是先進后出的原則,那么當用戶按Back鍵時,當前的這個Activity銷毀。前一個Activity又一次恢復。
二、Activity生命周期
先看下圖:
這個圖不再多說什么,以下我們通過一個實例來說明問題。
新建project,編寫例如以下代碼:
代碼非常easy,僅僅涉及到一個Activity,一些用戶的操作,我們通過記錄操作和打印日志的方式來看看Activity的生命周期過程。
1、? 執行
看到例如以下打印日志:
08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onCreate
08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onStart
08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onResume
2、按下返回按鍵:
08-31 09:29:57.396: INFO/ActivityLifeDemo(354): onPause
08-31 09:29:58.216: INFO/ActivityLifeDemo(354): onStop
08-31 09:29:58.216: INFO/ActivityLifeDemo(354): onDestroy
3、長按Home鍵。彈出近期打開過的應用程序,點擊ActivityLifeDemo
08-31 08:51:46.916: INFO/ActivityLifeDemo(312): onCreate
08-31 08:51:46.916: INFO/ActivityLifeDemo(312): onStart
08-31 08:51:46.936: INFO/ActivityLifeDemo(312): onResume
4、按Home鍵
08-31 08:53:32.676: INFO/ActivityLifeDemo(312): onPause
08-31 08:53:33.796: INFO/ActivityLifeDemo(312): onStop
5、在AllList中點擊打開
08-31 08:54:14.286: INFO/ActivityLifeDemo(312): onRestart
08-31 08:54:14.286: INFO/ActivityLifeDemo(312): onStart
08-31 08:54:14.296: INFO/ActivityLifeDemo(312): onResume
通過日志信息。我們能夠看到。Activity的啟動過程:onCreate—onStart—onResume;下返回鍵時:onPause—onStop—onDestroy 正如上面說是,當按下返回鍵時,此Activity彈出棧。程序銷毀。確實如此。我們再次 打開時的啟動過程又回到onCreate—onStart—onResume。OK,啟動之后按下Home鍵?;氐絃auncher。查看信息打印:onPause—onStop。再次打開的執行過程:onRestart—onStart—onResume。
我們通過對Activity的各種操作,構成了Activity的生命周期,我們看到不管對Activity做怎樣的操作,都會接收到相關的回調方法,那么我們在開發的過程中通過這些回調方法就能夠寫工作,比方說釋放一些重量級的對象。網絡連接,數據庫連接,文件讀等等。
下面是各個方法的具體說明:
onCreate():當?activity?第一次創建時會被調用。
在這種方法中你須要完畢全部的正常靜態設置?,比方創建一個視圖(?view?)、綁定列表的數據等等。
假設能捕獲到?activity?狀態的話,這種方法傳遞進來的?Bundle?對象將存放了?activity?當前的狀態。
調用該方法后通常會調用?onStart()?方法。
onRestart():在?activity?被停止后又一次啟動時會調用該方法。其興許會調用?onStart?方法。
onStart()à當?activity?對于用戶可見前即調用這種方法。假設?activity回到前臺則接著調用?onResume()?。假設?activity?隱藏則調用onStop()
onResume():在?activity?開始與用戶交互前調用該方法。在這時該activity?處于?activity?棧的頂部,而且接受用戶的輸入。
其興許會調用?onPause()?方法。
onPause():在系統準備開始恢復其他?activity?時會調用該方法。
這種方法中通經常使用來提交一些還沒保存的更改到持久數據?中。停止一些動畫或其他一些耗?CPU?的操作等等。不管在該方法里面進行不論什么操作。都須要較高速完畢,由于假設它不返回的話,下一個?activity?將無法恢復出來。
假設?activity?返回到前臺將會調用?onResume()?,假設?activity?變得對用戶不可見了將會調用onStop()?。
onStop():在?activity?對用戶不可見時將調用該方法??赡軙捎诋斍?activity?正在被銷毀。或還有一個?activity?(已經存在的activity?或新的?activity?)已經恢復了正準備覆蓋它,而調用該方法。假設?activity?正準備返回與用戶交互時興許會調用onRestart?,假設?activity?正在被釋放則會調用?onDestroy?。
onDestroy():在?activity?被銷毀前會調用該方法。
這是?activity?能接收到的最后一個調用??赡軙捎谟腥苏{用了?finish?方法使得當前activity?正在關閉,或系統為了保護內存暫時釋放這個?activity的實例,而調用該方法。你能夠用?isFinishing?方法來區分這兩種不同的情況。
三、怎樣啟動一個新的Activity?
要啟動一個新的Activity。我們能夠通過調用Context中的startActivity來啟動。像這樣:
Intent intent = new Intent(this, ActivityDemo.class); startActivity(intent); // ActivityDemo是須要啟動的Activity類通過上面的方法能夠啟動新的Activity了,但假設我要從當前的Activity中傳遞數據到新的Activity呢?非常easy:Intent intent = new Intent(this,ActivityDemo.class); Bundle bundle = new Bundle(); bundle.putBoolean("bool_key", true); intent.putExtras(bundle); startActivity(intent);
還有,有時候我們須要啟動帶返回值的Activity。簡單的說就是須要新啟動的Activity返回時將值傳遞給啟動它的Activity。像這樣:
Intent intent = new Intent(ActivityLifeDemo.this,RevalueActivity.class); startActivityForResult(intent, 0x1001);ActivityLifeDemo是當前的Activity。啟動RevalueActivity,我們在ActivityLifeDemo中須要獲取RevalueActivity傳回來的值。
那么在RevalueActivity中就必須這樣寫:
Intent intent = new Intent(); intent.putExtra("revalue_key","haha-revalueActivity"); setResult(0x1001, intent);那么“revalue_key”值在哪里獲取呢?必須重寫onActivityResult方法。通過推斷requestCode,來確定 if(requestCode==0x1001){String str = data.getStringExtra("revalue_key");Log.i(TAG, "返回的值為:"+str);}好了。具體的請看代碼吧。下載地址:http://download.csdn.net/detail/tangcheng_ok/3580700
?
四、保存Activity執行狀態
通過重寫onSaveInstanceState()方法來實現Activity的執行狀態。請注意下面幾點:
1)因為activity?對象被暫?;蛲V箷r,它仍然保留在內存里面,關于它的成員信息和當前狀態都是活動的,所以此時能夠保存Activity的狀態,從而使用戶所作的Activity的更改保存在內存中
2)? 當系統回收內存而將Activity銷毀時,就無法保存其狀態,所以須要調用onSaveInstanceState()方法來實現狀態的保存
3)? 非常多情況并不須要保持狀態信息,比方按下返回鍵直接關閉程序。所以并不能保證會調用onSaveInstanceState。假設調用了該方法。通常是在onStop?方法之前且可能在?onPause?之后調用。雖然如此,即使你沒做不論什么操作或沒有實現?onSaveInstanceState()?方法,你的?activity?狀態也能通過Activity?類里面默認實現的?onSaveInstanceState?方法恢復出來。
特別是會為布局中的視圖(?View?)默認調用onSaveInstanceState?方法。并在這種方法中同意每個視圖提供它須要恢復的不論什么信息。差點兒每個?Android框架中的?widget?都視情況實現了這種方法。
注:由于?onSaveInstanceState?方法不一定會被調用。所以你應該僅僅是用它來保存一些?activity?的轉換過程狀態(即?UI?的狀態),而不能用來保存永久性數據。但你能夠用?onPause?方法在用戶離開?activity?時來保存永久性數據。比方須要保存到數據庫的數據。
有一個非常好的方法能夠用來檢驗應用程序保存狀態的能力。就是簡單地旋轉你的設備來改變屏幕的方向。由于當屏幕方向改變時,系統為了給新的方向提供一個可能合適的取代資源,會銷毀?activity?并新建一個新的。
由于這個原因,你的?activity?能否在其又一次創建時完畢保存狀態就顯得尤為重要,由于用戶常常會在使用應用程序時旋轉屏幕的。
上文部分內容參考了:http://blog.csdn.net/sam_zhang1984/article/details/6430817,在這里多謝這位博主了。
五、全然退出程序
通過上面的介紹,我們知道當點擊back鍵時。程序調用了onDestroy方法。程序退出了,可是我們查看其進程,發現調用了onDestroy方法之后這個Activity還在執行。
甚至調用了finish()方法之后程序還能在進程中看到。通過以下這樣的方式能夠實現程序的全然退出:
Intent intent = new Intent(); Intent.setClass(context,MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra(“flag”,EXIT_APPLICATION); context.startActivity(intnet);ok。到目前為止。
這篇文章的制備。
總結
以上是生活随笔為你收集整理的Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 悼念传奇,约翰询问#183;纳什和他的妻
- 下一篇: 【非凡程序员】 OC第十八节课 (数据库