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

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

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

    Android

    移動(dòng)設(shè)備的心臟

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      1 隨筆 :: 1 文章 :: 6 評(píng)論 :: 0 Trackbacks
    文章可隨意轉(zhuǎn)載,但務(wù)必注明源地址


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

    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)來顯示你自己的UIactivity展現(xiàn)在用戶面前的經(jīng)常是全屏窗口,你也可以將activity作為浮動(dòng)窗口來使用(使用設(shè)置了windowIsFloating的主題),或者嵌入到其他的activity(使用ActivityGroup)中。下面是兩個(gè)幾乎所有Activity的子類都實(shí)現(xiàn)了的方法。

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

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

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

     

    Activity類是 的一個(gè)重要部分。

    這里涉及到的主題:

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

    Activity 生命周期

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

     

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

    • activity在屏幕的前景中(activity棧的頂端),它是active或者running狀態(tài)。
    • activity失去了焦點(diǎn)但是仍然可見(這個(gè)activity頂上遮擋了一個(gè)透明的或者非全屏的activity),它的狀態(tài)是paused。一個(gè)paused狀態(tài)的activity完全是alive的(它維護(hù)自己所有的狀態(tài)和成員信息,而且仍然在window manager的管理中),但當(dāng)系統(tǒng)內(nèi)存極度貧乏時(shí)也會(huì)將其killed
    • activity由于其他的activity而完全變暗,它就進(jìn)入了stopped狀態(tài)。它仍然保持著所有的狀態(tài)和成員的信息,可是,他對(duì)于用戶來說不可見,當(dāng)別的地方需要內(nèi)存的時(shí)候它經(jīng)常會(huì)被killed
    • activitypaused或者stopped,系統(tǒng)需要將其清理出內(nèi)存的時(shí)可以命令其finish或者簡(jiǎn)單kill其進(jìn)程。當(dāng)它重新在用戶面前顯示的時(shí)候,它必須完全重新啟動(dòng)并且將其關(guān)閉之前的狀態(tài)全部恢復(fù)回來。

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

    activity lifecycle

     

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

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

    下面的Activity方法定義了activity完整的生命周期。他們?nèi)际?/span>hook方法,你可以重載這些方法從而使activity在狀態(tài)改變時(shí)執(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í)行對(duì)應(yīng)的狀態(tài)恢復(fù)。其他的方法可以在需要時(shí)進(jìn)行實(shí)現(xiàn),當(dāng)實(shí)現(xiàn)這些方法的時(shí)候需要注意的是一定要調(diào)用父類中的對(duì)應(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)行了大塊的修改,請(qǐng)參考原文閱讀下面表格)


    方法

    描述

    Killable?

    下一方法

    onCreate()

    Activity初次創(chuàng)建時(shí)被調(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)建,本方法后將會(huì)調(diào)用onStart(),如果activity是停止后重新顯示,則將調(diào)用onRestart()

    No

    onStart() or onRestart()

     

    onStart()

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

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

    No

    onRestart() or onResume()

    onRestart()

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

    No

    onResume()

     

    onResume()

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

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

    No

    onFreeze()

    onFreeze()

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

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

    No

    onPause()

    onPause()

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

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

    Yes

    onResume() or
    onStop()

    onStop()

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

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

    Yes

    onStart() or
    onDestroy()

    onDestroy()

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

    Yes

    nothing


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

     

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

     

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

     

    配置改變

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

     

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

     

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

     

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

     

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

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

     

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

     

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

     

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

     

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

     

    public class MyActivity extends Activity {
         
    ...
         
    static final int PICK_CONTACT_REQUEST = 0;
         
    public boolean onKeyDown(int keyCode, KeyEvent event) {
             
    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
                 
    // When the user center presses, let them pick a contact.
                 startSubActivity
    (
                     
    new Intent(Intent.PICK_ACTION,
                     
    Uri.parse("content://contacts")),
                     PICK_CONTACT_REQUEST
    );
               
    return true;
             
    }
             
    return false;
         
    }
         
    protected void onActivityResult(int requestCode, int resultCode,
                 
    String data, Bundle extras) {
             
    if (requestCode == PICK_CONTACT_REQUEST) {
                 
    if (resultCode == RESULT_OK) {
                     
    // A contact was picked.  Here we will just display it
                     
    // to the user.
                     startActivity
    (new Intent(Intent.VIEW_ACTION,
                         
    Uri.parse(data)));
                 
    }
             
    }
         
    }
     
    }


    當(dāng)一個(gè)按鍵被按下時(shí)onKeyDown()啟動(dòng)一個(gè)新的activity。當(dāng)新的activity結(jié)束后onActivityResult()會(huì)被調(diào)用。

    保存持久狀態(tài)

    一般來說有兩類持久狀態(tài)需要activity來處理:類似于文檔的共享數(shù)據(jù)(一般使用content provider存儲(chǔ)在SQLite數(shù)據(jù)庫中)和就像用戶參數(shù)設(shè)定一樣的內(nèi)部狀態(tài)。

     

           對(duì)于content provider的數(shù)據(jù),我們建議activity使用“編輯即發(fā)生”用戶模型。就是說,用戶所做的任何編輯都將立即生效而不要求任何進(jìn)一步的確認(rèn)。下面兩條規(guī)則可以使支持這種模型成為一件簡(jiǎn)單的事情。

    ·         創(chuàng)建一個(gè)新文檔的時(shí)候,立即為它創(chuàng)建文件或者后臺(tái)數(shù)據(jù)庫條目。舉例來說,如果用戶要寫一封新郵件,當(dāng)他們開始輸入的時(shí)候馬上創(chuàng)建一個(gè)新的數(shù)據(jù)庫條目,所以即使他們輸入以后進(jìn)入別的activity,這封郵件也會(huì)在草稿箱中出現(xiàn)。

    ·         當(dāng)activityonPause()方法被調(diào)用時(shí),它應(yīng)該將任何用戶所做修改向后臺(tái)的content provider 或者文件提交。這可以確保即將運(yùn)行的其他activity可以看到這些修改。你可能會(huì)使用更激進(jìn)的方式來在你的activity生命周期中關(guān)鍵的時(shí)間點(diǎn)上提交數(shù)據(jù):例如在啟動(dòng)一個(gè)新的activity之前、終止你的activity之前、當(dāng)用戶在輸入域之間切換時(shí),等等。(譯者注:根據(jù)文檔的其他部份,個(gè)人覺得啟動(dòng)新activity之前及終止當(dāng)前activity之前進(jìn)行保存的說法都值得商榷,具體位置仍可能是在onPause())

    這個(gè)模型是為了避免用戶在activity之間切換時(shí)數(shù)據(jù)丟失而設(shè)計(jì)的,同時(shí)允許系統(tǒng)在activity處于paused狀態(tài)后任何時(shí)間都可以安全的kill這個(gè)activity(因?yàn)槠渌胤娇赡苄枰到y(tǒng)資源)。注意這隱含著一個(gè)含義,即用戶點(diǎn)擊你activityBACK鍵并不意味著“取消”——它意味著保存他當(dāng)前的內(nèi)容并離開你的activityActivity中取消編輯必須通過其他機(jī)制來提供,例如顯式的提供"revert" "undo"選項(xiàng)。

     

    如果需要了解更多關(guān)于content providers的信息,參見content package。這是不同的activity之間如何調(diào)用和彼此之間傳遞數(shù)據(jù)的關(guān)鍵。

     

    Activity同時(shí)提供了API來管理與activity相關(guān)聯(lián)的內(nèi)部持久狀態(tài)。這可以用來記憶用戶日歷的首選初始顯示(日期視圖或者周視圖)或者用戶web瀏覽器的缺省主頁這類信息。

     

           Activity持久狀態(tài)使用getPreferences(int)方法來管理,允許你取得和修改一系列與activity相關(guān)聯(lián)的名稱/取值對(duì)。如果要在應(yīng)用的多個(gè)組件(activities,recivers,services,providers)之間共享參數(shù),你可以使用底層方法Context.getSharedPreferences()來獲得存儲(chǔ)在一個(gè)特定名稱下的參數(shù)對(duì)象。(注意:在application packages之間不能共享設(shè)置數(shù)據(jù) —— 如果要這么做的話你需要使用content provider)。

     

    這里摘錄了一段日歷activity中的代碼,用來在永久設(shè)定中保存用戶首選的視圖模式。


    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文件中對(duì)應(yīng)的<activity>標(biāo)簽中進(jìn)行聲明來限制哪些應(yīng)用可以啟動(dòng)此Activity。如果你進(jìn)行了聲明,其它應(yīng)用需要在他們自己的manifest文件中聲明對(duì)應(yīng)的<uses-permission>元素(而且需要在安裝時(shí)被授予許可:譯者注)才可以啟動(dòng)這個(gè)activity

     

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

    進(jìn)程生命周期

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

     

    1.     前景activity(處于屏幕最上方,用戶與之交互的activity)被認(rèn)為是最重要的。如果設(shè)備上的內(nèi)存無法滿足它的使用,Kill此進(jìn)程只能作為最后的手段。一般來說這個(gè)時(shí)候設(shè)備處于內(nèi)存paging狀態(tài),為了使用戶界面保持響應(yīng)才會(huì)發(fā)出這個(gè)kill請(qǐng)求。

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

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

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

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

     

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


    posted on 2008-07-25 15:07 unamed 閱讀(22172) 評(píng)論(6)  編輯  收藏 所屬分類: Android 的文章

    評(píng)論

    # re: android.app.Activity 的介紹 2008-07-25 15:24 Always BaNg.
    難得樓主花這么多時(shí)間,先鼓勵(lì)一個(gè)。
    我覺得google收購(gòu)的android根本就是迫于壓力在假開源,并且就其產(chǎn)品來說,真的沒有什么前途,進(jìn)度很慢,bug很多,給他們寫信還不叼你。  回復(fù)  更多評(píng)論
      

    # re: android.app.Activity 的介紹 2008-07-25 15:32 馬云南
    @Always BaNg.

    此話怎講?主要是我感覺難得有這樣的平臺(tái),前景也不錯(cuò)哦,為什么會(huì)這么說哪,我對(duì)業(yè)界還真沒有什么太多的了解  回復(fù)  更多評(píng)論
      

    # re: android.app.Activity 的介紹 2008-07-25 15:40 隔葉黃鶯
    對(duì)于 Android 來說,現(xiàn)在還只能意淫下。  回復(fù)  更多評(píng)論
      

    # re: android.app.Activity 的介紹[未登錄] 2012-12-05 00:20
    不知道為什么 樓主不繼續(xù)搞了. 現(xiàn)在可以很好的回答那個(gè)說安卓前景不好的那位  回復(fù)  更多評(píng)論
      

    # re: android.app.Activity 的介紹 2013-02-23 11:37 于謙的父親王老爺子
    先頂樓主。
    安卓假開源?前景不行?呵呵  回復(fù)  更多評(píng)論
      

    # re: android.app.Activity 的介紹 2013-09-01 17:23 水分子
    very good  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲一线产区二线产区区| 久久久久亚洲AV片无码下载蜜桃| 亚洲综合色区在线观看| 久久久久亚洲?V成人无码| 亚洲精品制服丝袜四区| 亚洲黄色片在线观看| 亚洲中文字幕精品久久| 猫咪免费人成网站在线观看入口| 人妻18毛片a级毛片免费看| 国产午夜精品久久久久免费视| 亚洲免费视频观看| 18禁超污无遮挡无码免费网站国产| 又黄又爽一线毛片免费观看| 亚洲乱码国产乱码精品精| 亚洲成人免费网站| 男男黄GAY片免费网站WWW| 国产一区二区三区免费| a级毛片无码免费真人| 亚洲免费日韩无码系列| 久久精品国产亚洲AV麻豆网站 | 九九全国免费视频| 久久久久免费看成人影片| 热久久精品免费视频| 亚洲色成人WWW永久网站| 亚洲国产成人精品久久| 青青久久精品国产免费看| 免费人成在线观看网站品爱网| 日韩一级视频免费观看| 亚洲国产精品一区二区久久hs| 亚洲日韩精品无码专区加勒比☆| 中文字幕免费在线看线人动作大片| 妻子5免费完整高清电视| 亚洲人成国产精品无码| 亚洲国产美女精品久久久久| 全黄A免费一级毛片| 国产成人午夜精品免费视频| 国产成人精品日本亚洲专区61 | 蜜桃AV无码免费看永久| www.亚洲色图| 亚洲天堂福利视频| 国产免费A∨在线播放|