Activity生命週期、回調方法及狀態詳解

 

Activity概述

ActivityAndroid組件中最基本也是最爲常見用的四大組件(Activity活動,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器)之一。 前端

Activity是「單任務焦點」的,也就是說用戶只能與一個activerunning)的Activity交互。一個Activity一般就是一個單獨的屏幕/界面,負責管理界面上的各類控件(widgets),能夠在ActivityonCreate(Bundle savedInstanceState)方法中調用setContentView(int layoutResID) 向其添加視圖/控件, layoutResID爲在xml中定義的layout,能夠經過自動生成的R類訪問:R.layout.xxx。 android

Activity類的繼承關係及實現的主要接口以下圖所示,繼承自Activity的主要子類有FragmentActivity,  ListActivity,  NativeActivity, ActivityGroup 等。 安全

Activity做爲與用戶的交互界面,須要保持快速響應,通常5秒左右就會提示異常,所以在Activity中不作耗時的操做,以下載上傳數據。耗時操做可使用Service或者使用多線程。 多線程

Activity生命週期

Activity的使用首先須要深刻理解其生命週期 ide

Activity在應用程序的整個生命週期中扮演者重要的角色,系統採用一個「活動堆棧」來管理全部的Activity,一個新Activity啓動後會被放在堆棧頂部,並保持running狀態,前一個runningactivity將被下壓並暫停,直到用戶back,新Activity退出後回到棧頂並running,這正是棧的先進後出原則。 動畫

Activity回調方法

Activity定義了大量的回調方法來完成整個生命週期,這些方法都是會自動調用的,能夠在Activity的子類中重載,添加所須要的邏輯代碼: spa

方法 .net

簡介 線程

Killable? xml

next方法

onCreate(Bundle)

Activity建立後被調用的第一個方法,通常用來完成全部的靜態設置,如中建立viewsListView綁定數據,如調用:setContentView(int layoutResID)

findViewById(int id)ps:若是是fragment中的控件,該方法返回nullfragment是在該方法以後執行的)

Bundle參數能夠用來恢復以前保持的狀態數據,橫豎屏切換的時候則會用到。

該方法調用以後通常會自動調用onStart()方法

No

onStart()

onRestart()

Stopped狀態的Activity從新被調用的時候調用該方法。如用戶由其餘Activity返回的時候。

No

onStart()

onStart()

activity被調到前臺可見以前執行該方法。在建立onCreate後或者從新啓動onRestart後調用。該方法執行後,通常狀況下,系統會自動調用onResume()方法,異常狀況,也有可能直接調用onStop()方法。

No

onResume()

onStop()

onResume()

調用該方法後,Activity處於前臺可見、可交互狀態,Activity處於running狀態

No

onPause()

onPause()

Activity在被其餘activity遮蓋以前執行該方法;Activity處於Paused狀態,在3.1以前的版本中在極端狀況下回被系統killed

在這個方法中能夠用來保存持久化數據、中止動畫和其餘消耗cpu的事情等,只能執行輕量級的快速操做。

執行耗時的操做在onStop比較合適一些

 

onResume()

onStop()

onStop()

Activity徹底不可見的時候執行該方法,好比:新的Activity啓動並覆蓋了當前的activity,或者返回到前一個Activity。當前Activity處於Stopped,隨時可能被系統銷燬,也有可能被從新啓動調到前臺。

異常狀況,該方法可能不會執行,Activity直接被killed

Yes

onRestart()

onDestroy()

onDestroy()

Activity資源被系統回收以前執行的最後一個方法,調用finish()或者系統臨時銷燬Activity的時候調用,可使用isFinishing()進行判斷是正常銷燬仍是異常狀況。

用戶改變設置(屏幕方向、語言、輸入設備等)當前Activity實例會被銷燬,而後從新建立一個新的實例;

異常狀況,該方法可能不會執行,Activity直接被killed

Yes

 

 

其它重要方法

 

 

onSaveInstanceState(Bundle)

可使用方法onSaveInstanceState(Bundle)保存狀態信息,如UI的變化信息,而後調用方法onCreate(Bundle)恢復;

Activity生命週期內,一些狀況下該方法可能不會執行,用onPause()方法代替。

用戶按下home鍵、長按home鍵、按下電源鍵、啓動另一個activity、切換屏幕方向等onSaveInstanceState會被調用;

 

 

onConfigurationChanged(Configuration) 

用戶設置(如屏幕方向)改變觸發的回調方法。

Manifest.xml中配置android:configChanges,指定在哪些狀況下執行該方法,如 locale|fontScale|orientation ,經過這樣設置則Activity不從新建立,爲指定的配置改變,則會致使Activity從新建立。

在實際開發中橫豎屏切換等保留Activity不被從新建立是很是重要的。

 

 

onActivityResult(int,int, ntent)

使用startActivityForResult方法啓動另一個Activity,在返回的時候觸發該事件。

參數:

requestCode:請求碼,用來標記是由哪一個請求返回的結果,與startActivityForResult中的一致。

resultCode:結果碼,與setResult中的參數一致,經常使用的:RESULT_CANCELED RESULT_OKRESULT_FIRST_USER等。

Data:附件的數據Intent對象,

 

 

 

這些回調方法的調用順序:

Ø  第一次啓動:onCreate(Bundle)——onStart()——onResume(),完成調用後Activity在最前端與用戶是能夠交互的。

Ø  啓動後按下home鍵:onPause()——onStop()Activity中止stoped,再次運行的時候調用順序:onRestart()——onStart()——onResume()

Ø  啓動以後按下back鍵:onPause()——onStop()——onDestroy ()Activity銷燬,調用:onCreate(Bundle)——onStart()——onResume()從新啓動

Ø  調用另一個ActivityonPause()——onStop()將當前Activity 中止stoped,而後調用新的ActivityonCreate(Bundle)——onStart()——onResume()將新Activity激活。

Ø  按下返回back鍵:onPause()——onStop()——onDestroy ()將當前的Activity銷燬,而後調用onRestart()——onStart()——onResume()從新回到前一個Activity

 

Activity幾種狀態

Activity的生命週期中,一般有四種狀態(runningpausedstoppeddestroyed):

Ø  Running在屏幕最前面,界面是可見的、可交互的,運行在堆棧的頂部,執行完onResume()方法以後直到onPause()就是這個狀態。

Ø  Paused被其餘activity部分覆蓋的時候,界面可見但失去焦點,不可交互, activity是存活的(保留了全部狀態信息),當系統內存很低的時候可能會被直接killed掉。執行完onPause()後直到onStop()就是這個狀態。Paused狀態的Activity調用onResume方法後能夠從新回到活動狀態。

Ø  Stopped被其餘Activity徹底覆蓋的時候,仍保留了狀態信息,界面徹底不可見,Stopped狀態的Activity一般都會由於須要內存而被系統killed。執行完onStop()方法後直到onDestroy()就是這個狀態。Stopped狀態的Activity調用onRestart方法能夠從新回到活動狀態。

Ø  Destroyed處於Paused Stopped狀態的Activity,當系統要求(調用finish()方法)或者被移除killedActivity則被Destroyed掉,系統能夠將其從內存中清除。DestroyedActivity代表其已經被銷燬,若是須要再使用者須要從新create

一個Activity生命週期中,這些回調方法執行有三種的狀況:

Ø  lifetimeonCreate(Bundle)onDestroy()onCreate配置資源,onDestroy銷燬資源,如在onCreate中建立後臺線程,在onDestroy中中止。

Ø  可見lifetime onStart() onStop()Activity在屏幕上可見,有可能不在前臺,不能與用戶交互。onStartonStop能夠被屢次執行。

Ø  前臺liftimeonResume()onPause()Activity處於前臺,可以與用戶交互, resumed paused狀態能夠屢次切換,這兩個方法中放在輕量級代碼。

Android是多任務系統,系統會對Activity進行一個優先級排序:

Ø  foreground activity位於屏幕最上層與用戶交互的Activity,其進程通常不會被killed,系統異常狀況下,也是最後被killed的。

Ø  visible activity可見不可交互的,優先級僅次於foreground activity

Ø  background activity不可見,其進程可能會被系統安全的killed以回收內存,從新回到該Activity的時候,其onCreate(Bundle)onSaveInstanceState(Bundle)會被調用恢復狀態信息。

Ø  empty process沒有Activity或者組件在運行。系統會自動結束進程回收資源,所以,在activity以外執行後臺操做的時候須要在BroadcastReceiverService


參考閱讀:http://my.oschina.net/keeponmoving/blog/60943

相關文章
相關標籤/搜索