簡單的說:Activity就是佈滿整個窗口或者懸浮於其餘窗口上的交互界面。在一個應用程序中一般由多個Activity構成,都會在Manifest.xml中指定一個主的Activity,以下設置java
<activity android:label="@string/app_name" android:name=".MainActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
當程序第一次運行時用戶就會看這個Activity,這個Activity能夠經過啓動其餘的Activity進行相關操做。當啓動其餘的Activity時這個當前的這個Activity將會中止,新的Activity將會壓入棧中,同時獲取用戶焦點,這時就可在這個Activity上操做了。都知道棧是先進後出的原則,那麼當用戶按Back鍵時,當前的這個Activity銷燬,前一個Activity從新恢復。android
先看下圖:數據庫
這個圖再也不多說什麼,下面咱們經過一個實例來講明問題。新建工程,編寫以下代碼:網絡
package com.android.ttx.actiitylifedemo; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; public class ActivityLifeDemo extends Activity { private final static String TAG="ActivityLifeDemo"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG, "onCreate"); } @Override protected void onStart() { Log.i(TAG, "onStart"); super.onStart(); } @Override protected void onRestart() { Log.i(TAG, "onRestart"); super.onRestart(); } @Override protected void onResume() { Log.i(TAG, "onResume"); super.onResume(); } @Override protected void onPause() { Log.i(TAG, "onPause"); super.onPause(); } @Override protected void onStop() { Log.i(TAG, "onStop"); super.onStop(); } @Override protected void onDestroy() { Log.i(TAG, "onDestroy"); super.onDestroy(); } }
代碼很簡單,只涉及到一個Activity,一些用戶的操做,咱們經過記錄操做和打印日誌的方式來看看Activity的生命週期過程。app
一、 運行
看到以下打印日誌:
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
二、按下返回按鍵:
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
三、長按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
四、按Home鍵
08-31 08:53:32.676: INFO/ActivityLifeDemo(312): onPause
08-31 08:53:33.796: INFO/ActivityLifeDemo(312): onStop
五、在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鍵,回到Launcher,查看打印信息:onPause—onStop,再次打開的運行過程:onRestart—onStart—onResume。ide
咱們經過對Activity的各類操做,構成了Activity的生命週期,咱們看到不管對Activity作如何的操做,都會接收到相關的回調方法,那麼咱們在開發的過程當中經過這些回調方法就能夠寫工做,好比說釋放一些重量級的對象,網絡鏈接,數據庫鏈接,文件讀等等。佈局
如下是各個方法的詳細說明:動畫
onCreate():當 activity 第一次建立時會被調用。在這個方法中你須要完成全部的正常靜態設置 ,好比建立一個視圖( view )、綁定列表的數據等等。若是能捕獲到 activity 狀態的話,這個方法傳遞進來的 Bundle 對象將存放了 activity 當前的狀態。調用該方法後通常會調用 onStart() 方法。this
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,咱們能夠經過調用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); }
經過重寫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 是否能在其從新建立時完成保存狀態就顯得尤其重要,由於用戶常常會在使用應用程序時旋轉屏幕的。
經過上面的介紹,咱們知道當點擊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);