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

【Android Developers Training】 17. 停止和重

系統(tǒng) 2136 0

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

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


正確地停止和重啟你的activity在整個(gè)生命周期過(guò)程中是非常重要的,它可以讓用戶感覺到你的應(yīng)用一直處于活躍狀態(tài),并且不會(huì)丟失他們的進(jìn)度。以下是一些你的activity被停止或者被重啟的例子:

  • 用戶打開了最近使用過(guò)的應(yīng)用窗口,并且從你的應(yīng)用切換到了另一個(gè)應(yīng)用。此時(shí)你的處于前臺(tái)的activity被停止。如果用戶從主菜單頁(yè)面或者最近使用過(guò)的應(yīng)用窗口回到你的應(yīng)用,此時(shí)之前被停止的activity會(huì)被重啟。
  • 用戶在你的應(yīng)用中進(jìn)行了一個(gè)啟動(dòng)另一個(gè)新activity的操作。當(dāng)新activity被創(chuàng)建時(shí),當(dāng)前的activity會(huì)被停止。如果用戶此時(shí)按下返回鍵,第一個(gè)activity會(huì)被重啟。
  • 當(dāng)用戶在使用你的應(yīng)用時(shí)接到了電話

Activity 類中的兩個(gè)生命周期函數(shù) onStop() onRestart() ,使你可以在activity被停止或被重啟時(shí),進(jìn)行一些處理。不像在暫停態(tài)時(shí),activity是部分可見的。停止態(tài)時(shí)的activity是完全不可見的,同時(shí)用戶的焦點(diǎn)也在另一個(gè)activity上(或另一個(gè)應(yīng)用上)。

Note:

因?yàn)楫?dāng) Activity 被停止時(shí),系統(tǒng)在RAM中保存了它的實(shí)例,所以有可能你并不需要實(shí)現(xiàn) onStop() onRestart() 方法(甚至連 onStart() 方法也不需要,對(duì)于大多數(shù)相對(duì)比較簡(jiǎn)單的activity來(lái)說(shuō),即使這些方法沒(méi)有實(shí)現(xiàn)也不會(huì)有什么問(wèn)題,你只需要使用 onPause() 方法停止正在執(zhí)行的操作,并且釋放系統(tǒng)資源就行了)。

?

圖1. 當(dāng)用戶離開你的activity時(shí),系統(tǒng)會(huì)調(diào)用 onStop() 方法來(lái)停止你的activity(1),當(dāng)用戶返回到這個(gè)activity時(shí),

系統(tǒng)會(huì)調(diào)用 onRestart() 方法( 2 緊跟著執(zhí)行 onStart() 3 )方法和 onResume() 4 )。注意不管發(fā)生了什么使得 activity 被停止,

系統(tǒng)都會(huì)在調(diào)用 onStop() 方法之前調(diào)用 onPause() 方法。

?

一). 停止你的Activity

當(dāng)你的Activity被調(diào)用了 onStop() 方法,此時(shí)它將不再可見,并且釋放大多數(shù)用戶不再需要的資源。一旦你的Activity被停止,系統(tǒng)可能會(huì)在內(nèi)存不足的情況下銷毀它的實(shí)例。在極端的情況下,系統(tǒng)可能會(huì)直接結(jié)束你的應(yīng)用進(jìn)程,并且不調(diào)用最終的 onDestroy() 回調(diào)函數(shù),所以務(wù)必要在 onStop() 中釋放資源來(lái)防止內(nèi)存泄露。

雖然 onPause() onStop() 之前被調(diào)用,你應(yīng)該在 onStop() 中進(jìn)行負(fù)荷更大,更消耗CPU的操作,比如把信息寫入數(shù)據(jù)庫(kù)。

例如,以下是一個(gè) onStop() 的實(shí)現(xiàn),它將一段內(nèi)容的草稿存到手機(jī)存儲(chǔ)當(dāng)中:

      
        @Override


      
      
        protected
      
      
        void
      
      
         onStop() {

    
      
      
        super
      
      .onStop();  
      
        //
      
      
         Always call the superclass method first



    
      
      
        //
      
      
         Save the note's current draft, because the activity is stopping

    
      
      
        //
      
      
         and we want to be sure the current note progress isn't lost.
      
      

    ContentValues values = 
      
        new
      
      
         ContentValues();

    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());

    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());



    getContentResolver().update(

            mUri,    
      
      
        //
      
      
         The URI for the note to update.
      
      

            values,  
      
        //
      
      
         The map of column names and new values to apply to them.
      
      
        null
      
      ,    
      
        //
      
      
         No SELECT criteria are used.
      
      
        null
      
      
        //
      
      
         No WHERE columns are used.
      
      
                    );

}
      
    

當(dāng)你的 Activity 被停止時(shí),activity對(duì)象會(huì)保存在存儲(chǔ)中,并且當(dāng)它恢復(fù)時(shí),會(huì)從存儲(chǔ)中重新調(diào)用。你不需要再重新初始化那些進(jìn)入恢復(fù)態(tài)之前的所有回調(diào)函數(shù)中已經(jīng)創(chuàng)建好了的組件。系統(tǒng)也會(huì)在一個(gè) Bundle (一種鍵值對(duì))中對(duì)布局中的每一個(gè) View 記錄好它的狀態(tài)(如 EditText 中的文字)。并且當(dāng)用戶回到相同的activity實(shí)例時(shí),恢復(fù)它們。(下一節(jié)課會(huì)繼續(xù)討論使用 Bundle 來(lái)存儲(chǔ)其它的數(shù)據(jù),防止你的activity被銷毀或重新創(chuàng)建)。

?

二). 啟動(dòng)/重啟你的Activity

當(dāng)你的activity從停止態(tài)回到前臺(tái),它會(huì)調(diào)用 onRestart() 方法。系統(tǒng)也同時(shí)會(huì)調(diào)用 onStart() 方法,該方法每當(dāng)你的 activity 變?yōu)榭梢姇r(shí)會(huì)調(diào)用(不管是被重新啟動(dòng)的還是被第一次創(chuàng)建的)。然而, onRestart() 方法只在 activity 從停止態(tài)恢復(fù)時(shí)才會(huì)被調(diào)用,所以你可以用它來(lái)實(shí)現(xiàn)一些特殊的恢復(fù)工作,這些工作也許僅在 activity 之前被停止,但沒(méi)有被銷毀時(shí),有著特殊的作用。

對(duì)于一個(gè)應(yīng)用來(lái)說(shuō),使用 onRestart() 方法來(lái)恢復(fù)狀態(tài)看上去不太尋常,所以關(guān)于這個(gè)方法應(yīng)該如何使用,沒(méi)有一個(gè)指導(dǎo)性的建議。不過(guò),因?yàn)槟愕? onStop() 方法會(huì)清除你的activity的大部分資源,因此 當(dāng)activity重啟時(shí), 你需要重新初始化它們。然而另一方面,當(dāng)activity第一次被創(chuàng)建時(shí)(即沒(méi)有該activity已經(jīng)存在的實(shí)例),你也需要初始化它們。所以,你應(yīng)該經(jīng)常使用 onStart() 方法來(lái)和 onStop() 方法相對(duì)應(yīng),因?yàn)樵谏鲜鰞煞N情況下(activity從停止態(tài)恢復(fù)和第一次被創(chuàng)建),系統(tǒng)都會(huì)調(diào)用 onStart() 方法。

例如,因?yàn)橛脩艨赡茉诨氐侥愕膽?yīng)用之前已經(jīng)離開你的應(yīng)用很久了,在 onStart() 方法中檢查一些需要的系統(tǒng)功能是否可以被調(diào)用是一個(gè)不錯(cuò)的方法:

      
        @Override


      
      
        protected
      
      
        void
      
      
         onStart() {

    
      
      
        super
      
      .onStart();  
      
        //
      
      
         Always call the superclass method first

    

    
      
      
        //
      
      
         The activity is either being restarted or started for the first time

    
      
      
        //
      
      
         so this is where we should make sure that GPS is enabled
      
      

    LocationManager locationManager =
      
         

            (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    
      
      
        boolean
      
       gpsEnabled =
      
         locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    

    
      
      
        if
      
       (!
      
        gpsEnabled) {

        
      
      
        //
      
      
         Create a dialog here that requests the user to enable GPS, and use an intent

        
      
      
        //
      
      
         with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action

        
      
      
        //
      
      
         to take the user to the Settings screen to enable GPS when they click "OK"
      
      
            }

}



@Override


      
      
        protected
      
      
        void
      
      
         onRestart() {

    
      
      
        super
      
      .onRestart();  
      
        //
      
      
         Always call the superclass method first

    

    
      
      
        //
      
      
         Activity being restarted from stopped state    
      
      

}
    

當(dāng)系統(tǒng)銷毀了你的activity時(shí),它會(huì)對(duì)你的activity調(diào)用 onDestroy() 方法。因?yàn)槟阋呀?jīng)在 onStop() 方法中釋放了幾乎所有占用的資源,故當(dāng)被調(diào)用 onDestroy() 方法時(shí),其實(shí)大多數(shù)應(yīng)用沒(méi)有什么特別需要做的。這個(gè)方法是你清除那些可能會(huì)導(dǎo)致內(nèi)存泄露的資源的最后機(jī)會(huì),所以你應(yīng)該確定那些額外的線程被清除,并且那些長(zhǎng)時(shí)間運(yùn)行的操作,如函數(shù)追蹤器也被停止了。

【Android Developers Training】 17. 停止和重啟一個(gè)Activity


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 新野县| 乌恰县| 邢台市| 龙里县| 凤台县| 怀宁县| 延边| 呼玛县| 彰武县| 洪泽县| 辛集市| 新竹县| 蓬安县| 新巴尔虎右旗| 石屏县| 双峰县| 资讯 | 石阡县| 桂阳县| 罗江县| 桦南县| 遵义县| 石家庄市| 高邮市| 友谊县| 通渭县| 大安市| 淮北市| 金溪县| 江口县| 白城市| 梧州市| 淮阳县| 三亚市| 玉林市| 古交市| 通辽市| 嵊泗县| 都兰县| 柳州市| 万山特区|