Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android --Activity生命周期詳解

android --Activity生命周期詳解

編輯:關於Android編程

一. 再探Activity生命周期
為了研究activity的生命周期,簡單測試代碼如下。

package com.example.testactivity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

private static final String LOG_TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.i(LOG_TAG, "MainActivity------onDestroy");
}

@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    Log.i(LOG_TAG, "MainActivity------onRestart");
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.i(LOG_TAG, "MainActivity------onResume");
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.i(LOG_TAG, "MainActivity------onStart");
}

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Log.i(LOG_TAG, "MainActivity------onStop");
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.i(LOG_TAG, "MainActivity------onPause");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

查看logcat,輸出如下:
1.點擊進入 app 後,點擊back button退出:

Alt text

2.點擊進入app後,直接鎖屏:
Alt text

解鎖屏幕後,activity被喚醒:
Alt text

3.點擊app進入 app後,點 home鍵退出,又進入:
Alt text

4.點擊 home鍵進入後直接鎖屏
Alt text

然後喚醒
Alt text

5.點擊app進入後,點home鍵退出,然後鎖屏:
Alt text

然後喚醒進入
Alt text

Alt text

說明:
1)onpause()方法在用戶離開activity時被調用(這一般並不表示activity要被銷毀了)。這個函數一般用來提交哪些需要保存狀態的數據。

2)對標簽的說明
除label,name,icon外還需指定一個或多個來確定該activity可以響應的intent。

是過濾器,action說明次activity時application的main入口,指定這個activity需要在系統的application 列表中列出!

注:android application要求所有應用程序組件(Activity,Service,ContentProvider,BroadcastReceiver)都必須顯示進行配置.

二.Activity之間的值傳遞

1)bundle(適用於數據比較少的情況)
Intent intent = new Intent();
intent.setClass(A.class,B.class);
intent.putExtra(“name”,”value”);
startActivity(intent);
之後再B.class中用
Intent intent = new Intent();
intent.getExtras()來獲取

2)Bundle(數據較多時使用)
Intent intent = new Intent(A.class,B.class));
Bundle bundle = new Bundle();
bundle.putString(“Stringkey1”,”value1”);
bundle.putString(“booleankey2”,”value2”);
intent.putExtra(“key”,bundle);
startActivity(intent);
之後再B.class中用
Intent intent = new Intent();
Bundle bundle = intent.getBundleExtra(“key”);
bundle.getBoolean(“booleankey2”);
bundle.getString(“Stringkey1”);來獲取。
3)解析startActivityForResult
適用於A跳轉到B,再返回到A,同時還要保留之前的用戶輸入。由於由頁面 A跳轉到頁面 B之後,A所在頁面的Activity已經被Destroy。所以,如果要重新返回A並顯示數據,就必須將A所在頁面的Activity再次喚醒,與此同時調用某個方法來獲取並顯示相應的數據。
所以一般用以下幾個步驟來實現
a.從A跳轉到B時使用startActivityForResult(Intent intent, int requestcode)方法;
b.再A頁面的Activity重寫onActivityResult方法,
onActivityResult(int requestcode, int resultcode, intent data);
其中參數1是提供給onActivityResult,用來確認數據是從哪個activity返回的,並且該參數和從A跳轉到B時使用startActivityForResult方法的requestcode相對應。
參數2由新的activity在關閉前向前面的activity返回數據時使用。
參數3是一個 intent,帶有從B所在Activity返回的數據。

A 所在頁面activity實現
onActivityResult(int requestcode, int resultcode, intent data){
    String result = data.getExtras().getString("result");
}

B所在activity實現:
 Intent intent = new Intent();

 intent.putExtra("result","value");
 B.this.SetResult(RESULT_OK,intent);
 B.this.finish();


未完待續。。。

---------------------------------------
好,今天接著來進一步解析Activity的生命周期。

自己畫了一下activity的生命周期圖,感覺很糟糕的樣子。。
Alt text
如圖所示,activity的整個生命周期有四種狀態,而對這四種狀態的描述通常使用一下7種方法來完成。
Activity的四種狀態分別是:

 a.running
 當activity運行於屏幕前台(處於activity棧的棧頂),此時它獲取了    焦點可以相應用戶操作,屬於running狀態,同一時刻只能有一個    activity處於running(active)狀態。

 b.paused
 此時Activity已經失去焦點,但是仍然對用戶可見,例如:在該activity之上有另外一個透明的    Activity或Toast,AlertDialog等彈出窗口時,該Activity則處於暫停狀態。暫停的Activity仍然    是處於存活狀態,(它保留著所有的狀態和成員信息並保持著和窗口管理器的連接),但當此時出現system     memory不夠用時,就會被系統殺掉。

 c.Stopped     
 指定Activity完全被另一個Activity遮擋時,它將處於停機狀態,但它仍保留著所有的狀態和成員信    息。只是此時指定的Activity對用戶不可見,但當此時出現system     memory不夠用時,就會被系統殺掉。

 d.Dead
 Activity尚未啟動,或者已經被手動中止,或者已經被system回收。導致Activity處於非活動狀態。
 手動中止可以在程序中調用finish方法;而被system回收,則是可能是因為內存不足。當system內存不足時,Dalvak虛擬機的內存回收規則如下:
     first:先回收與其它Activity,Service,Intent,Receiver無關的進程(優先回收獨立的        Activity)。所以,一些耗時的操作最好寫成Service。
     second:不可見(stopped)的Activity。
     Third:Service進程(經過前兩步後,內存不足時采取)。
     Fourth:    當前正在運行的(Running)Activity。

伴隨Activity生命周期的7個方法:

 當Activity從一種狀態進入另一種狀態時system會自動調用下面相應的方法來通知用戶這種變化。

a.Activity第一次被實例化的時候system會調用onCreate()方法(整個生命周期只調用一次)來進行初始化設置:
    為Activity提供所需布局文件;為按鈕綁定監聽器等靜態的設置操作。

b.Activity可見,但尚未獲得焦點,即不能與用戶進行交互時調用:onStart(),
c.Activity已經stopped之後重新被system啟動時調用onRestart();
d.當Activity獲得用戶焦點能進行交互時system調用onResume().

e.當system啟動另外一個Activity時,在新的Activity啟動之前被system調用來保存當前獲得用戶焦點的Activity中的持久數據,停止動畫等。當系統而非用戶自己出於回收內存而關閉了Activity。此時,用戶會期望當他再次回到這個Activity時,它仍保持著上次離開時的樣子,此時便調用onSaveInstanceState(),該方法用來保存Activity被殺之前的狀態,它在onPause之前被觸發,當system為了節省內存開銷銷毀了該Activity(或許用戶並不想銷毀)時就需要重寫這個方法了,當該Activity再次被實例化時會通過onCreate(Bundle saveInstanceState)將已經保存的臨時狀態數據傳入。需要注意的是
onSaveInstanceState() 方法並不會經常被調用,它的默認觸發條件為按下home鍵,按下電源鍵,橫豎屏切換三種情況。所以我們可以通過重寫onSaveInstanceState() 來記錄Activity的臨時數據。
而記錄持久數據時,應該使用onPause()來存儲。

f.當Activity完全被另一個Activity覆蓋不可見時system調用onStop();

g.當Activity被kill時system調用onDestroy(),用來釋放onCreate()方法中創建的資源,如結束線程等。需要注意的是和onCreate相對應,onDestroy()方法,在Activity的整個生命周期中也只被調用一次。

至此,關於Activity的梳理已經差不多了,最後需要注意一下的是設置Activity的android:configChanges=“”的設置。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved