Activity入門詳解(生命週期、以各類方式啓動Activity、狀態保存,徹底退出等)

1、什麼是Activity?

    簡單的說:Activity就是佈滿整個窗口或者懸浮於其餘窗口上的交互界面。在一個應用程序中一般由多個Activity構成,都會在AndroidManifest.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

2、Activity生命週期

先看下圖: 數據庫


這個圖再也不多說什麼,下面咱們經過一個實例來講明問題。新建工程,編寫以下代碼: 網絡

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 方法來區分這兩種不一樣的狀況。


3、如何啓動一個新的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);
        }



4、保存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 是否能在其從新建立時完成保存狀態就顯得尤其重要,由於用戶常常會在使用應用程序時旋轉屏幕的。

5、徹底退出程序

經過上面的介紹,咱們知道當點擊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);
相關文章
相關標籤/搜索