亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android Developers Training】 15. 啟動一個

系統(tǒng) 1935 0

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個人興趣愛好。

原文鏈接: http://developer.android.com/training/basics/activity-lifecycle/starting.html


不像其他的編程范例一樣應用的函數(shù)入口是“ main() ”方法,Android根據(jù)Activity處于何種聲明周期狀態(tài)去調用它所對應的生命周期回調函數(shù),以此來創(chuàng)建一個Activity實例。有一系列的生命周期函數(shù)用來啟動一個Activity,與之對應的,也有一系列生命周期函數(shù)來銷毀一個Activity。

這堂課將概要地講解一些最重要的生命周期函數(shù),然后向你展示如何處理第一個生命周期回調函數(shù),這個函數(shù)用來創(chuàng)建一個Activity的實例。

?

?一). 理解生命周期回調函數(shù)

在一個Activity的聲明周期中,系統(tǒng)會調用一系列聲明周期函數(shù),就像是一個金字塔階梯一樣向上爬行。每一個聲明階段都是金字塔上的一個臺階。當系統(tǒng)創(chuàng)建了一個新的Activity實例,每個聲明周期函數(shù)將Activity的狀態(tài)向上移動一個階段。在金字塔的頂端所對應的狀態(tài)是Activity已經(jīng)在前臺同時獲得了用戶焦點。

當用戶要離開這個Activity,系統(tǒng)會調用其他生命周期函數(shù)(延金字塔下行)以次來銷毀Activity。在有些情況中,Activity會只下行一部分,然后等待(比如用戶切換到了其他應用),之后Activity可以從這個狀態(tài)再回到頂端(如果用戶重新回到Activity),并且恢復到用戶離開時的狀態(tài)

圖1. 一個關于Activity生命周期的簡單描繪,我們用階梯狀金字塔來解釋它,這個圖展示了每個回調函數(shù)都會轉移Activity的狀態(tài)

根據(jù)你的Activity的復雜度,你可能不需要實現(xiàn)所有的聲明周期函數(shù)。然而,你務必要理解每一個生命周期函數(shù),并且在開發(fā)過程中,實現(xiàn)那些可以讓你的應用表現(xiàn)出用戶期望狀態(tài)的那些函數(shù)。實現(xiàn)你的Activity生命周期函數(shù)可以在多個方面讓你的應用表現(xiàn)出色,包括:

  • 不會因為用戶切換到另一個應用或者接了一個電話而崩潰
  • 不會在用戶不使用它時消耗太多系統(tǒng)資源
  • 不會在用戶離開應用再返回時,丟失使用進度
  • 不會在用戶切換屏幕方向時崩潰或丟失使用進度

隨著你進一步學習,會有多種如圖1中顯示的Activity狀態(tài)切換的情況。然而,只有這些狀態(tài)中的3個是靜態(tài)的。即,在一段時間內(非瞬時)Activity只能處于這三個狀態(tài)中的一個。

恢復態(tài)(Resumed)

在這個狀態(tài),Activity在前臺,并且用戶可以和它交互(獲得用戶焦點),有些時候也稱之為“運行態(tài)”

暫停態(tài)(Paused)

在這個狀態(tài),Activity有一部分被另一個Activity遮擋,也就是說,在前臺的這個Activity是半透明的,或者是沒有充滿整個屏幕的。當Activity處于這個狀態(tài)時,它不能接收用戶的輸入也不能執(zhí)行任何代碼。

停止態(tài)(Stopped)

在這個狀態(tài),Activity被完全地隱藏,無法被用戶看見,也可以理解為處于后臺。當處于停止態(tài)時,Activity的實例以及它的狀態(tài)信息,(如:成員變量)會被保留,這樣就能馬上使Activity轉移到恢復態(tài)。

?

?二). 指定你的啟動Activity

當用戶在主頁面點擊了你的應用圖標,系統(tǒng)會調用你在應用中聲明的啟動(launcher)Activity,(可理解為“main”)的 onCreate() 方法。這個Activity就是你的應用和用戶交互的主入口。

你可以在清單文件中定義哪個Activity作為入口Activity, AndroidManifest.xml 文件在你的項目工程的根目錄下。

你的應用的入口Activity必須在清單文件中使用 <intent-filter> 標簽 來聲明,在標簽中,具有 MAIN 行為(action),和 LAUNCHER 類別( category ),例如:

      
        <
      
      
        activity 
      
      
        android:name
      
      
        =".MainActivity"
      
      
         android:label
      
      
        ="@string/app_name"
      
      
        >
      
      
        <
      
      
        intent-filter
      
      
        >
      
      
        <
      
      
        action 
      
      
        android:name
      
      
        ="android.intent.action.MAIN"
      
      
        />
      
      
        <
      
      
        category 
      
      
        android:name
      
      
        ="android.intent.category.LAUNCHER"
      
      
        />
      
      
        </
      
      
        intent-filter
      
      
        >
      
      
        </
      
      
        activity
      
      
        >
      
    

Note:

當你使用Android SDK工具創(chuàng)建了一個新的Android項目工程,默認的項目文件會包含一個Activity,且它已在清單文件中擁有上述過濾器(filter)標簽聲明。

如果在你的Activity中, MAIN 行為或者 LAUNCHER 類別任何一個沒有聲明,那么你的應用圖標將不會在系統(tǒng)的主頁面應用圖標列表中出現(xiàn)。

?

三). 創(chuàng)建一個新的實例

大多數(shù)應用包含一些不同的Activity來讓用戶進行不同的操作。無論這個Activity是當用戶點擊應用圖標時所啟動的Activity,還是應用在對用戶操作進行響應時啟動的另一個Activity,系統(tǒng)通過調用 onCreate() 方法來創(chuàng)建每一個Activity實例。

你必須實現(xiàn) onCreate() 方法來表現(xiàn)出基本的應用啟動邏輯,這在該Activity整個生命周期中只發(fā)生一次。例如:你實現(xiàn)的 onCreate() 方法定義了用戶接口,同時還可能實例化一些類作用域下的變量。

例如:下述例子中的 onCreate() 方法展示了一些activity基本設置的代碼,比如聲明用戶接口(在一個XML布局文件中定義),定義了成員變量,配置了一些UI。

      TextView mTextView; 
      
        //
      
      
         Member variable for text view in the layout
      
      
        

@Override


      
      
        public
      
      
        void
      
      
         onCreate(Bundle savedInstanceState) {

    
      
      
        super
      
      
        .onCreate(savedInstanceState);



    
      
      
        //
      
      
         Set the user interface layout for this Activity

    
      
      
        //
      
      
         The layout file is defined in the project res/layout/main_activity.xml file
      
      
            setContentView(R.layout.main_activity);

    

    
      
      
        //
      
      
         Initialize member TextView so we can manipulate it later
      
      

    mTextView =
      
         (TextView) findViewById(R.id.text_message);

    

    
      
      
        //
      
      
         Make sure we're running on Honeycomb or higher to use ActionBar APIs
      
      
        if
      
       (Build.VERSION.SDK_INT >=
      
         Build.VERSION_CODES.HONEYCOMB) {

        
      
      
        //
      
      
         For the main activity, make sure the app icon in the action bar

        
      
      
        //
      
      
         does not behave as a button
      
      

        ActionBar actionBar =
      
         getActionBar();

        actionBar.setHomeButtonEnabled(
      
      
        false
      
      
        );

    }

}
      
    

Caution:

使用 SDK_INT 這種方法可以避免老版本系統(tǒng)執(zhí)行較新的API,但這種方法只適用于Android 2.0(API LEvel 5)及以上。比這再之前的系統(tǒng)會遇到一個運行時錯誤。

一旦 onCreate() 方法完成了執(zhí)行,系統(tǒng)會緊接著調用 onStart() onResume() 方法。你的Activity永遠不會停留在創(chuàng)建態(tài)(Created)或啟動態(tài)(Started)。從技術上說,當 onStart() 方法被調用后,activity對用戶變成可見的,但是 onResume() 方法緊跟著執(zhí)行,然后activity保持在恢復態(tài)(Resumed)直到某些事件發(fā)生改變了它,比如當有一個電話打來,或這個用戶到了另一個activity,或者這個屏幕關閉了。

在后續(xù)的課程中,你將會看到其它用于啟動的方法( onStart() onResume() 方法 ),在你的activity生命周期中是非常重要的,尤其在當activity處于暫停態(tài)或停止態(tài)時被調用用來恢復activity。

Note:

onCreate() 方法包括一個叫做“ savedInstanceState ”的參數(shù),在后續(xù)課程( Recreating an Activity )將會對其討論。

圖2. 圖中方框包括當創(chuàng)建一個新的activity實例時的三個回調方法: onCreate() , onStart() onResume()

一旦這一系列回調函數(shù)執(zhí)行完畢,activity到達了恢復態(tài),用戶可與其交互,直到用戶切換到了另一個activity。

?

四). 銷毀Activity

Activity生命周期的第一個回調函數(shù)是 onCreate() ,最后一個回調函數(shù)式 onDestroy() 。當系統(tǒng)為activity調用這個方法后,就意味著activity實例從RAM中徹底被移除。

大多數(shù)應用不需要實現(xiàn)這個方法,因為本地類引用會隨著activity被銷毀,并且你的activity會在 onPause() 方法和 onStop() 方法中執(zhí)行大多數(shù)的清除工作。然而,如果你的activity包含有在 onCreate() 中創(chuàng)建的后臺線程,或者其他會長時間運行的資源,不實現(xiàn) onDestroy() 方法會導致內存泄露,所以你應該在 onDestroy() 中清除它們。

      
        @Override


      
      
        public
      
      
        void
      
      
         onDestroy() {

    
      
      
        super
      
      .onDestroy();  
      
        //
      
      
         Always call the superclass

    

    
      
      
        //
      
      
         Stop method tracing that the activity started during onCreate()
      
      
            android.os.Debug.stopMethodTracing();

}
      
    

Note:

系統(tǒng)會在 onPause() onStop() 方法執(zhí)行后調用 onDestroy() 方法。有一個情況例外:當你在 onCreate() 方法中調用 finish() 方法。有一些這樣的例子:比如當你的 activity 是一個零時的決策者,用來決定要啟動哪一個 activity 。你可能會在 onCreate() 方法中調用 finish() 方法。在這種情況下,系統(tǒng)會馬上調用 onDestroy() 方法,而不會調用任何其他的生命周期函數(shù)。

【Android Developers Training】 15. 啟動一個Activity


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国内精品中文字幕 | 亚洲精品一区专区 | 色偷偷亚洲精品一区二区 | 久在线| 一级床上爽高清播放 | 一本清高清dvd日本播放器 | 色综合色狠狠天天综合色hd | 久久r视频 | 国产精品视频播放 | 欧美与黑人午夜性猛交久久久 | 国产精品日韩欧美一区二区三区 | 国产最新网站 | 性感美女一级毛片 | 91精品视频在线播放 | 欧美一级高清视频在线播放 | 好看的中文字幕在线 | 精品国产一区二区麻豆 | 亚洲国产精品久久久久久 | 999精品免费视频观看 | 青草视频.com | 成年人免费毛片 | 天天艹天天射 | 久99久精品免费视频热77 | 成人毛片免费观看视频 | 亚洲欧洲国产精品久久 | 九九自拍| 色婷婷5月精品久久久久 | 26uuu另类欧美亚洲日本 | 深夜在线| 国产69精品久久久久99不卡 | 亚洲高清中文字幕综合网 | 欧美视频在线不卡 | 天天视频免费入口 | 99精品高清不卡在线观看 | 深夜福利视频在线一区 | 免费精品精品国产欧美在线 | 欧美日韩中文字幕一区二区高清 | 久草久草久草 | 亚洲日韩色综合视频 | 亚洲欧美日韩国产精品网 | 国产亚洲欧美成人久久片 |