<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冰浪

    哥已不再年輕 - 堅(jiān)定夢想,畢生追求!
    posts - 85, comments - 90, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    由于在Android中,進(jìn)程的生命周期大多數(shù)時(shí)候是由系統(tǒng)管理的;另外也由于手機(jī)應(yīng)用的一些特殊性,所以我們需要更多的去關(guān)注各個(gè)Android Component的運(yùn)行時(shí)生命周期模型。(所謂手機(jī)應(yīng)用的特殊性主要是指這樣2點(diǎn): 1. 手機(jī)應(yīng)用的大多數(shù)情況下我們只能在手機(jī)上看到一個(gè)程序的一個(gè)界面 ,用戶除了通過程序界面上的功能按鈕來在不同的窗體間切換,還可以通過Back鍵和Home鍵來返回上一個(gè)窗口,而用戶使用Back或者Home的時(shí)機(jī)是非常不確定的,任何時(shí)候用戶都可以使用Home或Back來強(qiáng)行切換當(dāng)前的界面。 2. 往往手機(jī)上一些特殊的事件發(fā)生也會強(qiáng)制的改變當(dāng)前用戶所處的操作狀態(tài),例如無論任何情況,在手機(jī)來電時(shí),系統(tǒng)都會優(yōu)先顯示電話接聽界面。)了解這些Component的生命周期模型一方面是讓我們對軟件在手機(jī)中的運(yùn)行情況做到心中有數(shù),更重要的,對于程序開發(fā)來說,生命周期中的每一個(gè)關(guān)鍵事件都會有我們可以覆寫于各種Component對應(yīng)基類型的事件處理方法,了解各Component的生命周期就是讓我們在開發(fā)程序時(shí)明白我們該怎樣去編寫各種事件的處理代碼。例如Activity的Create,就會有對應(yīng)的事件處理函數(shù)onCreate,我們可以從Activity基類覆寫這個(gè)事件處理函數(shù)完成我們需要的相關(guān)事件處理:

    public class actMain extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    …… //我們的事件處理代碼
    }
    ……

    這篇Post我們就來看看最常用的Activity的運(yùn)行時(shí)生命周期模型(Service的運(yùn)行時(shí)生命周期模型在下一篇講述了如何啟動一個(gè)Service并和其通信后再做描述)。 Activity的生命周期模型在Google提供的官方文檔上有比較詳細(xì)的一個(gè)圖示(請自行翻墻查看)。其一共包含7個(gè)我們需要關(guān)心的關(guān)鍵事件,下面對其分別詳細(xì)說明(文字中的粗體字表示后文中會經(jīng)常用到的概念在第一次出現(xiàn)時(shí)會給出解釋,之后后文不再詳細(xì)說明):


    1. void onCreate(Bundle savedInstanceState)
    當(dāng)Activity被第首次加載時(shí)執(zhí)行。我們新啟動一個(gè)程序的時(shí)候其主窗體的onCreate事件就會被執(zhí)行。如果Activity被銷毀后(onDestroy后),再重新加載進(jìn)Task時(shí),其onCreate事件也會被重新執(zhí)行。注意這里的參數(shù)savedInstanceState(Bundle類型是一個(gè)鍵值對集合,大家可以看成是.Net中的Dictionary)是一個(gè)很有用的設(shè)計(jì),由于前面已經(jīng)說到的手機(jī)應(yīng)用的特殊性,一個(gè)Activity很可能被強(qiáng)制交換到后臺(交換到后臺就是指該窗體不再對用戶可見,但實(shí)際上又還是存在于某個(gè)Task中的,比如一個(gè)新的Activity壓入了當(dāng)前的Task從而“遮蓋”住了當(dāng)前的Activity,或者用戶按了Home鍵回到桌面,又或者其他重要事件發(fā)生導(dǎo)致新的Activity出現(xiàn)在當(dāng)前Activity之上,比如來電界面),而如果此后用戶在一段時(shí)間內(nèi)沒有重新查看該窗體(Android通過長按Home鍵可以選擇最近運(yùn)行的6個(gè)程序,或者用戶直接再次點(diǎn)擊程序的運(yùn)行圖標(biāo),如果窗體所在的Task和進(jìn)程沒有被系統(tǒng)銷毀,則不用重新加載Process, Task和Task中的Activity, 直接重新顯示Task頂部的Activity, 這就稱之為重新查看某個(gè)程序的窗體),該窗體連同其所在的Task和Process則可能已經(jīng)被系統(tǒng)自動銷毀了,此時(shí)如果再次查看該窗體,則要重新執(zhí)行onCreate事件初始化窗體。而這個(gè)時(shí)候我們可能希望用戶繼續(xù)上次打開該窗體時(shí)的操作狀態(tài)進(jìn)行操作,而不是一切從頭開始。例如用戶在編輯短信時(shí)突然來電,接完電話后用戶又去做了一些其他的事情,比如保存來電號碼到聯(lián)系人,而沒有立即回到短信編輯界面,導(dǎo)致了短信編輯界面被銷毀,當(dāng)用戶重新進(jìn)入短信程序時(shí)他可能希望繼續(xù)上次的編輯。這種情況我們就可以覆寫Activity的void onSaveInstanceState(Bundle outState)事件,通過向outState中寫入一些我們需要在窗體銷毀前保存的狀態(tài)或信息,這樣在窗體重新執(zhí)行onCreate的時(shí)候,則會通過savedInstanceState將之前保存的信息傳遞進(jìn)來,此時(shí)我們就可以有選擇的利用這些信息來初始化窗體,而不是一切從頭開始。

    2. void onStart()
    onCreate事件之后執(zhí)行?;蛘弋?dāng)前窗體被交換到后臺后,在用戶重新查看窗體前已經(jīng)過去了一段時(shí)間,窗體已經(jīng)執(zhí)行了onStop事件,但是窗體和其所在進(jìn)程并沒有被銷毀,用戶再次重新查看窗體時(shí)會執(zhí)行onRestart事件,之后會跳過onCreate事件,直接執(zhí)行窗體的onStart事件。

    3. void onResume()
    onStart事件之后執(zhí)行?;蛘弋?dāng)前窗體被交換到后臺后,在用戶重新查看窗體時(shí),窗體還沒有被銷毀,也沒有執(zhí)行過onStop事件(窗體還繼續(xù)存在于Task中),則會跳過窗體的onCreate和onStart事件,直接執(zhí)行onResume事件。

    4. void onPause()
    窗體被交換到后臺時(shí)執(zhí)行。

    5. void onStop()
    onPause事件之后執(zhí)行。如果一段時(shí)間內(nèi)用戶還沒有重新查看該窗體,則該窗體的onStop事件將會被執(zhí)行;或者用戶直接按了Back鍵,將該窗體從當(dāng)前Task中移除,也會執(zhí)行該窗體的onStop事件。

    6. void onRestart()
    onStop事件執(zhí)行后,如果窗體和其所在的進(jìn)程沒有被系統(tǒng)銷毀,此時(shí)用戶又重新查看該窗體,則會執(zhí)行窗體的onRestart事件,onRestart事件后會跳過窗體的onCreate事件直接執(zhí)行onStart事件。

    7. void onDestroy()
    Activity被銷毀的時(shí)候執(zhí)行。在窗體的onStop事件之后,如果沒有再次查看該窗體,Activity則會被銷毀。


    最后用一個(gè)實(shí)際的例子來說明Activity的各個(gè)生命周期。假設(shè)有一個(gè)程序由2個(gè)Activity A和B組成,A是這個(gè)程序的啟動界面。當(dāng)用戶啟動程序時(shí),Process和默認(rèn)的Task分別被創(chuàng)建,接著A被壓入到當(dāng)前的Task中,依次執(zhí)行了onCreate, onStart, onResume事件被呈現(xiàn)給了用戶;此時(shí)用戶選擇A中的某個(gè)功能開啟界面B,界面B被壓入當(dāng)前Task遮蓋住了A,A的onPause事件執(zhí)行,B的onCreate, onStart, onResume事件執(zhí)行,呈現(xiàn)了界面B給用戶;用戶在界面B操作完成后,使用Back鍵回到界面A,界面B不再可見,界面B的onPause, onStop, onDestroy執(zhí)行,A的onResume事件被執(zhí)行,呈現(xiàn)界面A給用戶。此時(shí)突然來電,界面A的onPause事件被執(zhí)行,電話接聽界面被呈現(xiàn)給用戶,用戶接聽完電話后,又按了Home鍵回到桌面,打開另一個(gè)程序“聯(lián)系人”,添加了聯(lián)系人信息又做了一些其他的操作,此時(shí)界面A不再可見,其onStop事件被執(zhí)行,但并沒有被銷毀。此后用戶重新從菜單中點(diǎn)擊了我們的程序,由于A和其所在的進(jìn)程和Task并沒有被銷毀,A的onRestart和onStart事件被執(zhí)行,接著A的onResume事件被執(zhí)行,A又被呈現(xiàn)給了用戶。用戶這次使用完后,按Back鍵返回到桌面,A的onPause, onStop被執(zhí)行,隨后A的onDestroy被執(zhí)行,由于當(dāng)前Task中已經(jīng)沒有任何Activity,A所在的Process的重要程度被降到很低,很快A所在的Process被系統(tǒng)結(jié)束。

    轉(zhuǎn)自:http://hkbarton.sacredfir.com/?p=66

    主站蜘蛛池模板: 亚洲国产精品国自产拍电影| 亚洲人成网站色7799| 午夜宅男在线永久免费观看网| 亚洲人成网站免费播放| 国产精品亚洲w码日韩中文| 3d动漫精品啪啪一区二区免费| 亚洲欧美国产国产一区二区三区 | 永久免费视频网站在线观看| 亚洲精品无码久久久久A片苍井空| 中文字幕在亚洲第一在线| 曰批全过程免费视频网址| 免费人成又黄又爽的视频在线电影| 亚洲欧洲日产国码久在线观看| 日韩免费福利视频| 日日麻批免费40分钟无码| 亚洲av永久无码一区二区三区| 亚洲国产精品无码久久一区二区 | 亚洲欧洲成人精品香蕉网| 无码人妻一区二区三区免费| GOGOGO高清免费看韩国| 亚洲色图激情文学| 亚洲av无码无在线观看红杏| 国产午夜无码视频免费网站| 99热在线观看免费| 久久er国产精品免费观看8| 亚洲色最新高清av网站| 亚洲色图在线播放| 中文字幕精品亚洲无线码二区 | 亚洲高清视频免费| 久久亚洲国产精品123区| 午夜爱爱免费视频| 91精品国产免费久久久久久青草| 亚洲阿v天堂在线2017免费| 亚洲综合无码一区二区痴汉| 亚洲毛片在线观看| 亚洲精品无码久久久影院相关影片| 国产免费黄色大片| 青青青国产免费一夜七次郎| 无码区日韩特区永久免费系列| 久久久久久久岛国免费播放| 国产乱妇高清无乱码免费|