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

【Android Developers Training】 17. 停止和重

系統(tǒng) 2004 0

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

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


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

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

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

Note:

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

?

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

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

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

?

一). 停止你的Activity

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

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

例如,以下是一個 onStop() 的實現(xiàn),它將一段內(nèi)容的草稿存到手機存儲當(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 被停止時,activity對象會保存在存儲中,并且當(dāng)它恢復(fù)時,會從存儲中重新調(diào)用。你不需要再重新初始化那些進入恢復(fù)態(tài)之前的所有回調(diào)函數(shù)中已經(jīng)創(chuàng)建好了的組件。系統(tǒng)也會在一個 Bundle (一種鍵值對)中對布局中的每一個 View 記錄好它的狀態(tài)(如 EditText 中的文字)。并且當(dāng)用戶回到相同的activity實例時,恢復(fù)它們。(下一節(jié)課會繼續(xù)討論使用 Bundle 來存儲其它的數(shù)據(jù),防止你的activity被銷毀或重新創(chuàng)建)。

?

二). 啟動/重啟你的Activity

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

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

例如,因為用戶可能在回到你的應(yīng)用之前已經(jīng)離開你的應(yīng)用很久了,在 onStart() 方法中檢查一些需要的系統(tǒng)功能是否可以被調(diào)用是一個不錯的方法:

      
        @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時,它會對你的activity調(diào)用 onDestroy() 方法。因為你已經(jīng)在 onStop() 方法中釋放了幾乎所有占用的資源,故當(dāng)被調(diào)用 onDestroy() 方法時,其實大多數(shù)應(yīng)用沒有什么特別需要做的。這個方法是你清除那些可能會導(dǎo)致內(nèi)存泄露的資源的最后機會,所以你應(yīng)該確定那些額外的線程被清除,并且那些長時間運行的操作,如函數(shù)追蹤器也被停止了。

【Android Developers Training】 17. 停止和重啟一個Activity


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 屏东市| 资溪县| 凭祥市| 武山县| 利津县| 桂阳县| 田林县| 嘉禾县| 黎城县| 华阴市| 安吉县| 青神县| 二连浩特市| 辽宁省| 东乌珠穆沁旗| 天水市| 连江县| 永善县| 涿鹿县| 灵宝市| 德钦县| 静海县| 上高县| 金坛市| 靖安县| 永福县| 綦江县| 汉源县| 绥宁县| 永顺县| 桑植县| 闸北区| 喀什市| 高台县| 襄樊市| 湘西| 呈贡县| 罗江县| 含山县| 隆昌县| 迁西县|