日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

android.app.Activity 的介紹

系統(tǒng) 2631 0

發(fā)現(xiàn)當(dāng)前Android的資料不是很多,而且對于Activity的介紹也很少,所以把官方文檔的android.app.Activity的介紹翻譯了一下,加入了一些自己的理解。各位如果覺得我自己理解的不對,請無視。歡迎郵件討論。
android.app.Activity 的介紹

android.app
public class

android.app.Activity

java.lang.Object

android.content.Context

android.app.ApplicationContext ?? ViewInflate.Factory

android.app.Activity ???? KeyEvent.Callback Window.Callback

?

?

Activity 是用戶唯一可以看得到的東西。幾乎所有的 activity 都與用戶進(jìn)行交互,所以 Activity 主要負(fù)責(zé)的就是創(chuàng)建顯示窗口,你可以在這些窗口里使用 setContentView(View) 來顯示你自己的 UI activity 展現(xiàn)在用戶面前的經(jīng)常是全屏窗口,你也可以將 activity 作為浮動窗口來使用(使用設(shè)置了 windowIsFloating 的主題),或者嵌入到其他的 activity (使用 ActivityGroup )中。下面是兩個幾乎所有 Activity 的子類都實(shí)現(xiàn)了的方法。

onCreate(Bundle) 這個方法是初始化 activity 的地方 . 最重要的是,你經(jīng)常需要在這里使用 setContentView(int) 來設(shè)置 UI 布局所使用的 layout 資源 , 當(dāng)你需要使用程序控制 UI 中的組件時可以使用 findViewById(int) 來獲得對應(yīng)的視圖。

當(dāng)用戶離開 activity 時你可以在 onPause() 進(jìn)行相應(yīng)的操作 . 更重要的是,用戶做的任何改變都應(yīng)該在該點(diǎn)上提交 ( 經(jīng)常提交到 ContentProvider 這里保存數(shù)據(jù) )

如果要使用 Context.startActivity() 來啟動 activity, activity 都必須在啟動者應(yīng)用包的 AndroidManifest.xml 文件中 有對應(yīng)的 <activity> 定義。

?

Activity 類是 application's overall lifecycle 的一個重要部分。

?

這里涉及到的主題 :

  1. Activity 生命周期
  2. 配置改變
  3. 啟動Activity 并獲得結(jié)果
  4. 保存 持久 狀態(tài)
  5. 許可
  6. 進(jìn)程 生命周期

Activity 生命周期

系統(tǒng)中的 Activity 可以通過一個 activity 棧來進(jìn)行管理。當(dāng)一個新的 activity 啟動的時候,它首先會被放置在 activity 棧頂部并成為 running 狀態(tài)的 activity —— 之前的 activity 也在 activity 棧中,但總是被保存在它的下邊,只有當(dāng)這個新的 activity 退出以后之前的 activity 才能重新回到前景界面。

?

所有的 activity 本質(zhì)上有四種狀態(tài):

  • activity 在屏幕的前景中( activity 棧的頂端),它是 active 或者 running 狀態(tài)。

?

  • activity 失去了焦點(diǎn)但是仍然可見(這個 activity 頂上遮擋了一個透明的或者非全屏的 activity ),它的狀態(tài)是 paused 。一個 paused 狀態(tài)的 activity 完全是 alive 的(它維護(hù)自己所有的狀態(tài)和成員信息,而且仍然在 window manager 的管理中),但當(dāng)系統(tǒng)內(nèi)存極度貧乏時也會將其 killed

?

  • activity 由于其他的 activity 而完全變暗,它就進(jìn)入了 stopped 狀態(tài)。它仍然保持著所有的狀態(tài)和成員的信息,可是,他對于用戶來說不可見,當(dāng)別的地方需要內(nèi)存的時候它經(jīng)常會被 killed
  • activity paused 或者 stopped ,系統(tǒng)需要將其清理出內(nèi)存的時可以命令其 finish 或者簡單 kill 其進(jìn)程。當(dāng)它重新在用戶面前顯示的時候,它必須完全重新啟動并且將其關(guān)閉之前的狀態(tài)全部恢復(fù)回來。

下面的圖表是 Activity 的狀態(tài)圖,直角矩形代表了 callback 方法,你可以實(shí)現(xiàn)這些方法從而使 Activity 在改變狀態(tài)的時候執(zhí)行你制定的操作。帶顏色的橢圓形是 Activity 的主要狀態(tài)。

?

?

? 這里有三個比較關(guān)鍵的生命周期。

  • 從最初 調(diào)用 onCreate(Bundle) 到最終調(diào)用 onDestroy() 稱為 完整生命周期 Activity 會在 onCreate() 進(jìn)行所有“全局”狀態(tài)的設(shè)置,在 onDestroy() 中釋放所有持有的資源。舉個例子,如果它有一個從網(wǎng)絡(luò)上下載數(shù)據(jù)的后臺線程,那他可能就會在 onCreate() 中創(chuàng)建這個線程并在 onDestroy() 中停止這個線程。
  • activity 調(diào)用 onStart() 開始,到調(diào)用對應(yīng)的 onStop() 為止稱為 可見生命周期 。在這段時間內(nèi)用戶可以在屏幕上看到這個 activity ,盡管并不一定是在前景也不一定可以和用戶交互。在這兩個方法之間你可以維護(hù)那些 activity 在用戶顯示時所需的資源。舉個例子來說,你可以在 onStart() 中注冊一個 IntentReceiver 來監(jiān)控那些可以對你的 UI 產(chǎn)生影響的環(huán)境改變,當(dāng)你的 UI 不繼續(xù)在用戶面前顯示時你可以在 onStop() 中注銷這個 IntentReceiver 。每當(dāng) activity 在用戶面前顯示或者隱藏時都會調(diào)用相應(yīng)的方法,所以 onStart() onStop() 方法在整個生命周期中可以多次被調(diào)用。
  • activity 調(diào)用 onResume() 開始,到調(diào)用對應(yīng)的 onPause() 為止稱為 前景生命周期 ,這段時間 activity 處于其他所有 activity 的前面,且與用戶交互。一個 activity 可以經(jīng)常在 resumed paused 狀態(tài)之間轉(zhuǎn)換——例如手機(jī)進(jìn)入休眠時、 activity 的結(jié)果返回時、新的 intent 到來時——所以這兩個方法中的代碼應(yīng)該非常的簡短。

下面的 Activity 方法定義了 activity 完整的生命周期。他們?nèi)际? hook 方法,你可以重載這些方法從而使 activity 在狀態(tài)改變時執(zhí)行你所期望的操作。所有 activity 都應(yīng)該實(shí)現(xiàn)自己的 onCreate(Bundle) 方法來進(jìn)行初始化設(shè)置;大部分還應(yīng)該實(shí)現(xiàn) onPause() 方法提交數(shù)據(jù)的修改并且準(zhǔn)備終止與用戶的交互。盡管我們計(jì)劃在系統(tǒng)中添加更多的工具來管理應(yīng)用,現(xiàn)在大多 activity 仍需要實(shí)現(xiàn) onFreeze() 并且在 onCreate(Bundle) 中執(zhí)行對應(yīng)的狀態(tài)恢復(fù)。其他的方法可以在需要時進(jìn)行實(shí)現(xiàn),當(dāng)實(shí)現(xiàn)這些方法的時候需要注意的是一定要調(diào)用父類中的對應(yīng)方法。

?

          
            public class Activity extends ApplicationContext {
     protected void onCreate(Bundle icicle);
     protected void onStart();
     protected void onRestart();
     protected void onResume();
     protected void onFreeze(Bundle outIcicle);
     protected void onPause();
     protected void onStop();
     protected void onDestroy();
 } 

 

          
        

?

?

?

一般來說 activity 的生命周期變化看起來比較象下面的表格:

?

(此處譯者進(jìn)行了大塊的修改,請參考 原文 閱讀下面表格)


?

方法

描述

Killable?

下一方法

onCreate()

Activity 初次創(chuàng)建時被調(diào)用,你應(yīng)該在這里進(jìn)行一般的靜態(tài)設(shè)置:創(chuàng)建 view 、將數(shù)據(jù)綁定到 list 等等。如果 activity 之前存在凍結(jié)狀態(tài),那么此狀態(tài)將在 Bundle 中提供。

如果 activity 首次創(chuàng)建,本方法后將會調(diào)用 onStart() ,如果 activity 是停止后重新顯示,則將調(diào)用 onRestart()

No

onStart() or onRestart()

?

onStart()

當(dāng) activity 對用戶即將可見的時候調(diào)用。

其后調(diào)用 onRestart() onResume() ( 框架是否進(jìn)行選擇性調(diào)用 onResume() 僅僅是猜測 )

No

onRestart() or onResume ()

onRestart()

當(dāng) activity 從停止?fàn)顟B(tài)重新啟動時調(diào)用。其后調(diào)用 onResume()

No

onResume()

?

onResume()

當(dāng) activity 將要與用戶交互時調(diào)用此方法,此時 activity activity 棧的棧頂,用戶輸入已經(jīng)可以傳遞給它。

如果其他的 activity 在它的上方恢復(fù)顯示,則將調(diào)用 onFreeze()

No

onFreeze()

onFreeze()

當(dāng)你的 activity 被暫停而其他的 activity 恢復(fù)與用戶交互的時候這個方法會被調(diào)用(在其他 activity 顯示之前),你可以使用這個方法保存你當(dāng)前的用戶狀態(tài)(一般來說是當(dāng)前實(shí)例的用戶狀態(tài))。暫停之后,為了回收資源供給前景 activity ,系統(tǒng)會在需要的時間停止(或者 kill )你的應(yīng)用。以后如果你的 activity 啟動一個新的實(shí)例重新與用戶進(jìn)行交互,你保存在這里的狀態(tài)都將通過 onCreate() 方法傳遞給新的實(shí)例。

其后總是調(diào)用 onPause() 方法。

No

onPause()

onPause()

當(dāng)系統(tǒng)要啟動一個其他的 activity 時調(diào)用(其他的 activity 顯示之前),這個方法被用來提交那些持久數(shù)據(jù)的改變、停止動畫、和其他占用 CPU 資源的東西。由于下一個 activity 在這個方法返回之前不會 resumed ,所以實(shí)現(xiàn)這個方法時代碼執(zhí)行要盡可能快。

如果 activity 重新回到前景時將調(diào)用 onResume() 如果對用戶徹底不可見則會調(diào)用 onStop()

Yes

onResume() or
onStop()

onStop()

當(dāng)另外一個 activity 恢復(fù)并遮蓋住此 activity, 導(dǎo)致其對用戶不再可見時調(diào)用。一個新 activity 啟動、其它 activity 被切換至前景、當(dāng)前 activity 被銷毀時都會發(fā)生這種場景。

當(dāng) activity 重新回到前景與用戶交互時調(diào)用 onRestart() ,如果 activity 將退出則調(diào)用 onDestory()

Yes

onStart() or
onDestroy()

onDestroy()

在你的 activity 被銷毀前所調(diào)用的最后一個方法,當(dāng)進(jìn)程終止時會出現(xiàn)這種情況(對 activity 直接調(diào)用 finish() 方法或者系統(tǒng)為了節(jié)省空間而臨時銷毀此 activity 的實(shí)例,你可以通過 isFinishing() 的返回值來區(qū)分這兩種情況)。

Yes

nothing


: 這個表格本人覺得還有些值得商榷的地方,建議作為參考閱讀,不管是原文還是譯文。

?

注意上表中“ Killable ”這一列 —— 對于那些標(biāo)記 killable 的方法,當(dāng)這些方法結(jié)束后, activity 的進(jìn)程可能在任何時間被系統(tǒng) kill 而不再執(zhí)行 activity 中的任何代碼。因此你應(yīng)該利用 onFreeze() (保存你當(dāng)前 UI 的狀態(tài))和 onPause() (將所有的修改寫回持久存儲),這樣 activity 才能在被 kill 的時候正確的保存當(dāng)前的狀態(tài)。如果需要了解一個進(jìn)程的生命周期與他所執(zhí)行的 activity 之間的關(guān)系 參見 進(jìn)程生命周期 部分。

?

?????? 對于那些標(biāo)記 killable 的方法,從這些方法啟動開始直到返回之前, activity 的進(jìn)程都不回被系統(tǒng) kill 。舉個例子,一個 activity onPause() 方法返回后處于 killable 的狀態(tài),這種狀態(tài)會一直持續(xù)到 onResume() 方法開始執(zhí)行。

?

配置改變

如果設(shè)備的配置(在 Resources.Configuration 中進(jìn)行了定義)發(fā)生改變,那么所有用戶界面上的東西都需要進(jìn)行更新,以適應(yīng)新的配置。因?yàn)? Activity 是與用戶交互的最主要的機(jī)制,它包含了處理配置改變的專門支持。

?

?????? 除非你特殊指定,否則當(dāng)配置發(fā)生改變(比如屏幕方向、語言、輸入設(shè)備等等的改變)時你當(dāng)前的 activity 都將被銷毀,這銷毀是通過一個正常的 activity 生命周期過程( onFreeze(Bundle) , onPause() , onStop() , onDestroy() )進(jìn)行的。如果 activity 之前正在前景畫面,當(dāng)這個實(shí)例的 onDestroy() 調(diào)用完成后將會啟動這個 activity 的一個新的實(shí)例,并將前面那個實(shí)例中 onFreeze(Bundle) 所保存的內(nèi)容傳遞給新的實(shí)例。

?

因?yàn)槿魏蔚膽?yīng)用資源(包括 layout 文件)都有可能由于任何配置值而改變。因此處理配置改變的唯一安全的方法就是重新獲取所有的資源,包括 layout 、繪圖資源(原文 drawables )、字符串資源。由于 activity 已經(jīng)如何保存自己的狀態(tài)并從這些狀態(tài)中重建自身,所以 activity 重新啟動自身來獲得新的配置將是一個非常便利的途徑。

?

?????? 在一些特殊的情況中,你可能希望當(dāng)一種或者多種配置改變時避免重新啟動你的 activity 。你可以通過在 manifest 中設(shè)置 android:configChanges 屬性來實(shí)現(xiàn)這點(diǎn)。你可以在這里聲明 activity 可以處理的任何配置改變,當(dāng)這些配置改變時不會重新啟動 activity ,而會調(diào)用 activity onConfigurationChanged(Resources.Configuration) 方法。如果改變的配置中包含了你所無法處理的配置(在 android:configChanges 并未聲明),你的 activity 仍然要被重新啟動,而 onConfigurationChanged(Resources.Configuration) 將不會被調(diào)用。

?

啟動 Activity 并獲得結(jié)果

startActivity(Intent) 方法可以用來啟動一個新的 activity ,這個 activity 將被放置在 activity 棧的棧頂。這個方法只有一個參數(shù) Intent ,這個參數(shù)描述了將被執(zhí)行的 activity

?

?????? 有時候你希望在一個 activity 結(jié)束時得到它返回的結(jié)果。舉個例子,你可能啟動一個 activity 來讓用戶從通訊簿中選擇一個人;當(dāng)它結(jié)束的時候?qū)祷剡@個所選擇的人。為了得到這個返回的信息,你可以使用 startSubActivity(Intent, int) 這個方法來啟動新的 activity ,第二個整形參數(shù)將會作為這次調(diào)用的識別標(biāo)記。這個 activity 返回的結(jié)果你可以通過 onActivityResult(int, int, String, Bundle) 方法來獲得,此方法的第一個參數(shù)就是之前調(diào)用所使用的識別標(biāo)記。

?

?????? 當(dāng) activity 退出的時候,它可以調(diào)用 setResult(int) 來將數(shù)據(jù)返回給他的父進(jìn)程。這個方法必須提供一個結(jié)果碼,這個結(jié)果碼可以使標(biāo)準(zhǔn)結(jié)果 RESULT_CANCELED, RESULT_OK ,也可以是其他任何從 RESULT_FIRST_USER 開始的自定義值。此外,它還可以返回一段字符串(經(jīng)常是一段數(shù)據(jù)的 URL 地址),一個包含它所有希望值的 Bundle 。這些信息都會在父 activity 的回調(diào)函數(shù) Activity.onActivityResult() 中出現(xiàn),并連同最初提供的識別標(biāo)記一起(此處有些拗口,意思其實(shí)就是子 activity 返回的內(nèi)容、返回碼、識別標(biāo)記都將作為參數(shù),按照不同的返回情況來調(diào)用父 activity Activity.onActivityResult() 方法,以實(shí)現(xiàn)出現(xiàn)各種返回時父 activity 做出響應(yīng)的處理)。

?

?????? 如果子 activity 由于某種情況發(fā)生失敗(例如 crashing ),父 activity 將會收到 RESULT_CANCELED 結(jié)果碼。

?

?????? 這里是一個例子,說明了如何啟動一個新的 activity 并處理結(jié)果。

?

          
            public class CalendarActivity extends Activity {
     ...
     static final int DAY_VIEW_MODE = 0;
     static final int WEEK_VIEW_MODE = 1;
     private SharedPreferences mPrefs;
     private int mCurViewMode;

     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         SharedPreferences mPrefs = getSharedPreferences();
         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
     }

     protected void onPause() {
         super.onPause();
         SharedPreferences.Editor ed = mPrefs.edit();
         ed.putInt("view_mode", mCurViewMode);
         ed.commit();
     }
 }

          
        

?

許可

你可以通過在 Activity 所屬應(yīng)用的 manifest 文件中對應(yīng)的 <activity> 標(biāo)簽中進(jìn)行

聲明來限制哪些應(yīng)用可以啟動此 Activity 。如果你進(jìn)行了聲明,其它應(yīng)用需要在他們

自己的 manifest 文件中聲明對應(yīng)的 <uses-permission> 元素( 而且需要在安裝時

被授予許可:譯者注 )才可以啟動這個 activity

?

如果需要了解更多有關(guān)于一般安全機(jī)制和許可方面的信息可以參考 Security Model

進(jìn)程生命周期

Android 系統(tǒng)會盡量久的保留應(yīng)用進(jìn)程。但是當(dāng)內(nèi)存降低時最終還是要移除舊的進(jìn)程。就像 Activity 生命周期 中描述的一樣,移除哪個進(jìn)程還是要取決于關(guān)聯(lián)的用戶與之交互的程度。一般來說,進(jìn)程可以基于其中運(yùn)行的 activity 所處的生命周期而分成四種狀態(tài),下面將這些狀態(tài)根據(jù)重要程度排列。系統(tǒng)會在 kill 更重要的進(jìn)程(第一個)之前首先 kill 那些不那么重要的進(jìn)程(最后一個)。

?

前景 activity (處于屏幕最上方,用戶與之交互的 activity )被認(rèn)為是最重要的。如果設(shè)備上的內(nèi)存無法滿足它的使用, Kill 此進(jìn)程只能作為最后的手段。一般來說這個時候設(shè)備處于內(nèi)存 paging 狀態(tài),為了

使用戶界面保持響應(yīng)才會發(fā)出這個 kill 請求。

可見 activity (一個對用戶可見,但是不在前景的 activity ,比如處在浮動對話框后)被認(rèn)為是非常重要的,除非為了保證前景 activity 運(yùn)行,否則不會被 kill

后臺 activity (一個對用戶不可見,并處于 paused 狀態(tài)的 activity )就不再重要了,所以當(dāng)需要為其它前景的或者可見的 activity 運(yùn)行而回收內(nèi)存時系統(tǒng)可以很安全的 kill 它們。

空進(jìn)程 是一個沒有運(yùn)行 activity 或者其他應(yīng)用組件(比如 Service 或者 IntentReceiver 類)的進(jìn)程。當(dāng)內(nèi)存開始降低時系統(tǒng)很快就會 kill 掉這些進(jìn)程。因此當(dāng)你要在 activity 外運(yùn)行任何的后臺操作時,必須在 IntentReceiver Service 的上下文環(huán)境中運(yùn)行,這樣系統(tǒng)才知道需要將你的進(jìn)程保留而不是 kill

有些時候 Activity 可能需要長時間運(yùn)行一個操作,且它并不依賴于 activity 的生命周期而存在。例如一個照相機(jī)應(yīng)用可能允許你將照片上傳到 web 站點(diǎn)。上傳可能需要很長時間,在上傳過程中應(yīng)該允許用戶離開這個應(yīng)用。為了做到這一點(diǎn),你的 activity 應(yīng)該在上傳時啟動一個 Service 來執(zhí)行此工作。這將使系統(tǒng)在你的進(jìn)程上傳數(shù)據(jù)的過程中能夠恰當(dāng)?shù)膮^(qū)分它的優(yōu)先級(認(rèn)為此進(jìn)程比其他不可見應(yīng)用更重要),不管原來的 activity 的狀態(tài)是 paused stopped 還是 finished

?

文章可隨意轉(zhuǎn)載,但務(wù)必注明出處
marshal.hird@gmail.com

?

?

?

android.app.Activity 的介紹


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 祁东县| 金寨县| 航空| 伽师县| 呼图壁县| 靖宇县| 繁峙县| 汕尾市| 芜湖市| 大石桥市| 阿拉善左旗| 徐汇区| 武清区| 康乐县| 密山市| 清丰县| 山东省| 南投县| 洪湖市| 岐山县| 东莞市| 江安县| 临猗县| 澳门| 广宗县| 江城| 伊春市| 沁水县| 嘉定区| 惠安县| 庐江县| 池州市| 花莲县| 富锦市| 永吉县| 定安县| 社旗县| 五常市| 寻甸| 灌云县| 湾仔区|