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

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

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

    隨筆 - 33, 文章 - 0, 評論 - 12, 引用 - 0
    數據加載中……

    Activity的生命周期

    注意到在Activity的API中有大量的onXXXX形式的函數定義,除了我們前面用到的onCreate以外,還有onStart,onStop以及onPause等等。從字面上看,它們是一些事件回調,那么次序又是如何的呢?其實這種事情,自己做個實驗最明白不過了。在做這個實驗之前,我們先得找到在Android中的Log是如何輸出的。

    顯然,我們要用的是android.util.log類,這個類相當的簡單易用,因為它提供的全是一些靜態方法:
    Log.v(String tag, String msg);        //VERBOSE
    Log.d(String tag, String msg);       //DEBUG    
    Log.i(String tag, String msg);        //INFO
    Log.w(String tag, String msg);     //WARN
    Log.e(String tag, String msg);      //ERROR
    前面的tag是由我們定義的一個標識,一般可以用“類名_方法名“來定義。
    輸出的LOG信息,如果用Eclipse+ADT開發,在LogCat中就可以看到,否則用adb logcat也行,不過我是從來都依賴于IDE環境的。

    好了,現在我們修改前面的HelloThree代碼:
       public void onStart()
        
    {
            
    super.onStart();
            Log.v(TAG,
    "onStart");
        }

        
    public void onStop()
        
    {
            
    super.onStop();
            Log.v(TAG,
    "onStop");
        }

        
    public void onResume()
        
    {
            
    super.onResume();
            Log.v(TAG,
    "onResume");
        }

        
    public void onRestart()
        
    {
            
    super.onRestart();
            Log.v(TAG,
    "onReStart");
        }

        
    public void onPause()
        
    {
            
    super.onPause();
            Log.v(TAG,
    "onPause");
        }

        
    public void onDestroy()
        
    {
            
    super.onDestroy();
            Log.v(TAG,
    "onDestroy");
        }

        
    public void onFreeze(Bundle outState)
        
    {
            
    super.onFreeze(outState);
            Log.v(TAG,
    "onFreeze");
        }
    在HelloThreeB中也同樣增加這樣的代碼,編譯,運行一下,從logcat中分析輸出的日志。
    在啟動第一個界面Activity One時,它的次序是:
    onCreate (ONE) - onStart (ONE) - onResume(ONE) 
    雖然是第一次啟動,也要走一遍這個resume事件。然后,我們點goto跳到第二個Activity Two中(前一個沒有關閉),這時走的次序是:
    onFreeze(ONE) - onPause(ONE) - onCreate(TWO) - onStart(TWO) - onResume(TWO) - onStop(ONE)
    說明,第二個Activity Two在啟動前,One會經歷一個:凍結、暫停的過程,在啟動Two后,One才會被停止?
    然后,我們再點back回到第一個界面,這時走的次序是:
    onPause(TWO) - onActivityResult(ONE) - onStart(ONE) - onRestart(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO)
    說明,返回時,Two沒有經歷凍結就直接暫停了,在One接收參數,重啟后,Two就停止并被銷毀了。
    最后,我們點一下Exit退出應用,它的次序是:
    onPause(ONE) - onStop(ONE) - onDestroy(ONE)
    說明如果我們用了finish的話,不會有freeze,但是仍會經歷pause - stop才被銷毀。

    這里有點疑問的是:為什么回來時先是Start才是Restart?可是文檔中的圖上畫的卻是先restart再start的啊?不過,后面的表格中的描述好象是正確的,start后面總是跟著resume(如果是第一次)或者restart(如果原來被stop掉了,這種情況會在start與resume中插一個restart)。

    下面不跑例子了,看看文檔吧。

    1.Android用Activity Stack來管理多個Activity,所以呢,同一時刻只會有最頂上的那個Activity是處于active或者running狀態。其它的Activity都被壓在下面了。

    2.如果非活動的Activity仍是可見的(即如果上面壓著的是一個非全屏的Activity或透明的Activity),它是處于paused狀態的。在系統內存不足的情況下,paused狀態的Activity是有可被系統殺掉的。只是不明白,如果它被干掉了,界面上的顯示又會變成什么模樣?看來下回有必要研究一下這種情況了。

    3.幾個事件的配對可以比較清楚地理解它們的關系。Create與Destroy配成一對,叫entrie lifetime,在創建時分配資源,則在銷毀時釋放資源;往上一點還有Start與Stop一對,叫visible lifetime,表達的是可見與非可見這么一個過程;最頂上的就是Resume和Pause這一對了,叫foreground lifetime,表達的了是否處于激活狀態的過程。

    4.因此,我們實現的Activity派生類,要重載兩個重要的方法:onCreate()進行初始化操作,onPause()保存當前操作的結果。

    除了Activity Lifecycle以外,Android還有一個Process Lifecycle的說明:

    在內存不足的時候,Android是會主動清理門戶的,那它又是如何判斷哪個process是可以清掉的呢?文檔中也提到了它的重要性排序:

    1.最容易被清掉的是empty process,空進程是指那些沒有Activity與之綁定,也沒有任何應用程序組件(如Services或者IntentReceiver)與之綁定的進程,也就是說在這個process中沒有任何activity或者service之類的東西,它們僅僅是作為一個cache,在啟動新的Activity時可以提高速度。它們是會被優先清掉的。因此建議,我們的后臺操作,最好是作成Service的形式,也就是說應該在Activity中啟動一個Service去執行這些操作。

    2.接下來就是background activity了,也就是被stop掉了那些activity所處的process,那些不可見的Activity被清掉的確是安全的,系統維持著一個LRU列表,多個處于background的activity都在這里面,系統可以根據LRU列表判斷哪些activity是可以被清掉的,以及其中哪一個應該是最先被清掉。不過,文檔中提到在這個已被清掉的Activity又被重新創建的時候,它的onCreate會被調用,參數就是onFreeze時的那個Bundle。不過這里有一點不明白的是,難道這個Activity被killed時,Android會幫它保留著這個Bundle嗎?

    3.然后就輪到service process了,這是一個與Service綁定的進程,由startService方法啟動。雖然它們不為用戶所見,但一般是在處理一些長時間的操作(例如MP3的播放),系統會保護它,除非真的沒有內存可用了。

    4.接著又輪到那些visible activity了,或者說visible process。前面也談到這個情況,被Paused的Activity也是有可能會被系統清掉,不過相對來說,它已經是處于一個比較安全的位置了。

    5.最安全應該就是那個foreground activity了,不到迫不得已它是不會被清掉的。這種process不僅包括resume之后的activity,也包括那些onReceiveIntent之后的IntentReceiver實例。

    在Android Application的生命周期的討論中,文檔也提到了一些需要注意的事項:因為Android應用程序的生存期并不是由應用本身直接控制的,而是由Android系統平臺進行管理的,所以,對于我們開發者而言,需要了解不同的組件Activity、Service和IntentReceiver的生命,切記的是:如果組件的選擇不當,很有可能系統會殺掉一個正在進行重要工作的進程。

    posted on 2011-08-03 15:41 建華 閱讀(227) 評論(0)  編輯  收藏 所屬分類: Android

    主站蜘蛛池模板: 精品国产免费观看久久久| 免费不卡在线观看AV| 国产一级一片免费播放| 亚洲精品日韩一区二区小说| 男男AV纯肉无码免费播放无码| 亚洲视频一区在线播放| xx视频在线永久免费观看| 亚洲天堂一区在线| 免费无码黄十八禁网站在线观看| 亚洲 欧洲 自拍 另类 校园| 夭天干天天做天天免费看| 国产精品久久久久久亚洲小说| 亚洲成A∨人片天堂网无码| 黄页网址大全免费观看12网站 | 国产男女爽爽爽爽爽免费视频| 亚洲国产美女福利直播秀一区二区| 九九精品免费视频| 亚洲av日韩av永久无码电影| 亚洲午夜av影院| 久9热免费精品视频在线观看| 在线观看亚洲人成网站| 最近最好的中文字幕2019免费| 久久久久亚洲精品无码网址色欲| 亚洲欧洲日本在线| 久久久久久毛片免费播放| 亚洲中文无码亚洲人成影院| 免费人成年激情视频在线观看| 国产真人无码作爱视频免费| 亚洲国产成人超福利久久精品| 国产精品无码免费视频二三区| 国产精品永久免费| 亚洲尹人九九大色香蕉网站| 在线a人片天堂免费观看高清| 国产成人精品免费大全| 亚洲精品国产福利在线观看| 午夜亚洲福利在线老司机| 暖暖免费日本在线中文| 亚洲女子高潮不断爆白浆| 亚洲AV无码不卡在线播放| 成年人免费观看视频网站| a级毛片毛片免费观看永久|