Activity詳解(生命週期,finish()、onDestory()和System.exit(0) )

一、什麼是Activity

       簡單的說:Activity就是佈滿整個窗口或者懸浮於其他窗口上的交互界面。在一個應用程序中通常由多個Activity構成,都會在Manifest.xml中指定一個主的Activity,如下設置

<actionandroid:name="android.intent.action.MAIN" />

      當程序第一次運行時用戶就會看這個Activity,這個Activity可以通過啓動其他的Activity進行相關操作。當啓動其他的Activity時這個當前的這個Activity將會停止,新的Activity將會壓入棧中,同時獲取用戶焦點,這時就可在這個Activity上操作了。都知道棧是先進後出的原則,那麼當用戶按Back鍵時,當前的這個Activity銷燬,前一個Activity重新恢復。

二、Activity生命週期

1). Activity的啓動過程:onCreate—onStart—onResume

2). 在當前Activity中彈出另外一個activity,再關閉彈出的activity:onPause—onResume(主activity未完全看不見)

3). 按下BACK返回鍵時:onPause—onStop—onDestroy (此Activity彈出棧,程序銷燬再次打開執行:onRestart—onStart—onResume)

4). 按下HOME鍵時:onPause—onStop(程序沒有銷燬,再次打開執行:onRestart—onStart—onResume,要保存狀態,參考http://blog.csdn.net/android_tutor/article/details/5772285)

5). 長按HOME鍵,從最近打開過的應用程序打開程序執行:onCreate—onStart—onResume

6). 總結:當主activity未完全看不見,停留在onPause;當主activity完全看不見(按返回onStop—onDestory,按home鍵onStop—onRestart)

無論對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的生命週期中,onDestory()方法是他生命的最後一步,資源空間什麼的都沒有咯~~。當重新進入此Activity的時候,必須重新創建,執行onCreate()方法。

Activity.finish()

Call this when your activity is done and should be closed. 

在你的activity動作完成的時候,或者Activity需要關閉的時候,調用此方法。

當你調用此方法的時候,系統只是將最上面的Activity移出了棧,並沒有及時的調用onDestory()方法,其佔用的資源也沒有被及時釋放。因爲移出了棧,所以當你點擊手機上面的“back”按鍵的時候,也不會找到這個Activity。

System.exit(0)

這玩意是退出整個應用程序的,是針對整個Application的。將整個進程直接KO掉。

使用時,可以寫在onDestory()方法內,亦可直接在想退出的地方直接調用:

如:System.exit(0); 或 android.os.Process.killProcess(android.os.Process.myPid());

三、啓動一個新的Activity

要啓動一個新的Activity,我們可以通過調用Context中的startActivity來啓動。像這樣:

Intent intent = new Intent(this, ActivityDemo.class);  
startActivity(intent);  // ActivityDemo是需要啓動的Activity類
通過上面的方法可以啓動新的Activity了,但如果我要從當前的Activity中傳遞數據到新的Activity呢?很簡單:

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 對象被暫停或停止時,它仍然保留在內存裏面,關於它的成員信息和當前狀態都是活動的,所以此時可以保存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);  
所有參考

http://blog.csdn.net/tangcheng_ok/article/details/6755194

http://blog.csdn.net/android_tutor/article/details/5772285

http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html

http://www.cnblogs.com/pengwang/archive/2011/04/30/2033548.html

http://blog.csdn.net/qq247890212/article/details/13090683

http://fzlihui.iteye.com/blog/1142928

http://blog.csdn.net/sbshi007/article/details/6284645


發佈了86 篇原創文章 · 獲贊 12 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章