android --Activity生命週期詳解

來源:互聯網
上載者:User

標籤:android   activity生命週期   

一. 再探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";@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);}@Overrideprotected void onDestroy() {    // TODO Auto-generated method stub    super.onDestroy();    Log.i(LOG_TAG, "MainActivity------onDestroy");}@Overrideprotected void onRestart() {    // TODO Auto-generated method stub    super.onRestart();    Log.i(LOG_TAG, "MainActivity------onRestart");}@Overrideprotected void onResume() {    // TODO Auto-generated method stub    super.onResume();    Log.i(LOG_TAG, "MainActivity------onResume");}@Overrideprotected void onStart() {    // TODO Auto-generated method stub    super.onStart();    Log.i(LOG_TAG, "MainActivity------onStart");}@Overrideprotected void onStop() {    // TODO Auto-generated method stub    super.onStop();    Log.i(LOG_TAG, "MainActivity------onStop");}@Overrideprotected void onPause() {    // TODO Auto-generated method stub    super.onPause();    Log.i(LOG_TAG, "MainActivity------onPause");}@Overridepublic 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退出:

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

解鎖螢幕後,activity被喚醒:

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

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

然後喚醒

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

然後喚醒進入

說明:
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的生命週期圖,感覺很糟糕的樣子。。

,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=“”的設定。

android --Activity生命週期詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.