乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android總結(jié)篇系列:Activity生命周期

       程序猿之家 2015-02-06

      原文地址http://www.cnblogs.com/lwbqqyumidi/p/3769113.html

      類似地址http://blog.csdn.net/liuhe688/article/details/6733407

       

      Android官方文檔和其他不少資料都對(duì)Activity生命周期進(jìn)行了詳細(xì)介紹,在結(jié)合資料和項(xiàng)目開發(fā)過程中遇到的問題,本文將對(duì)Activity生命周期進(jìn)行一次總結(jié)。


      Activity是由Activity棧進(jìn)管理,當(dāng)來到一個(gè)新的Activity后,此Activity將被加入到Activity棧頂,之前的Activity位于此Activity底部。Acitivity一般意義上有四種狀態(tài):


      1.當(dāng)Activity位于棧頂時(shí),此時(shí)正好處于屏幕最前方,此時(shí)處于運(yùn)行狀態(tài);


      2.當(dāng)Activity失去了焦點(diǎn)但仍然對(duì)用于可見(如棧頂?shù)腁ctivity是透明的或者棧頂Activity并不是鋪滿整個(gè)手機(jī)屏幕),此時(shí)處于暫停狀態(tài);


      3.當(dāng)Activity被其他Activity完全遮擋,此時(shí)此Activity對(duì)用戶不可見,此時(shí)處于停止?fàn)顟B(tài);


      4.當(dāng)Activity由于人為或系統(tǒng)原因(如低內(nèi)存等)被銷毀,此時(shí)處于銷毀狀態(tài);


      在每個(gè)不同的狀態(tài)階段,Adnroid系統(tǒng)對(duì)Activity內(nèi)相應(yīng)的方法進(jìn)行了回調(diào)。因此,我們?cè)诔绦蛑袑慉ctivity時(shí),一般都是繼承Activity類并重寫相應(yīng)的回調(diào)方法。


      先貼一張來自官方文檔(http://developer./reference/android/app/Activity.html)的圖,相信大家都看到過。


       


      圖中詳細(xì)給出了Activity整個(gè)生命周期的過程,以及在不同的狀態(tài)期間相應(yīng)的回調(diào)方法。


      圖中需要注意一下幾點(diǎn):


      1.Activity實(shí)例是由系統(tǒng)自動(dòng)創(chuàng)建,并在不同的狀態(tài)期間回調(diào)相應(yīng)的方法。一個(gè)最簡單的完整的Activity生命周期會(huì)按照如下順序回調(diào):onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。稱之為entire lifetime。


      2.當(dāng)執(zhí)行onStart回調(diào)方法時(shí),Activity開始被用戶所見(也就是說,onCreate時(shí)用戶是看不到此Activity的,那用戶看到的是哪個(gè)?當(dāng)然是此Activity之前的那個(gè)Activity),一直到onStop之前,此階段Activity都是被用戶可見,稱之為visible lifetime。


      3.當(dāng)執(zhí)行到onResume回調(diào)方法時(shí),Activity可以響應(yīng)用戶交互,一直到onPause方法之前,此階段Activity稱之為foreground lifetime。


      在實(shí)際應(yīng)用場(chǎng)景中,假設(shè)A Activity位于棧頂,此時(shí)用戶操作,從A Activity跳轉(zhuǎn)到B Activity。那么對(duì)AB來說,具體會(huì)回調(diào)哪些生命周期中的方法呢?回調(diào)方法的具體回調(diào)順序又是怎么樣的呢?


      開始時(shí),A被實(shí)例化,執(zhí)行的回調(diào)有A:onCreate -> A:onStart -> A:onResume。


      當(dāng)用戶點(diǎn)擊A中按鈕來到B時(shí),假設(shè)B全部遮擋住了A,將依次執(zhí)行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。


      此時(shí)如果點(diǎn)擊Back鍵,將依次執(zhí)行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。


      至此,Activity棧中只有A。在Android中,有兩個(gè)按鍵在影響Activity生命周期這塊需要格外區(qū)分下,即Back鍵和Home鍵。我們先直接看下實(shí)驗(yàn)結(jié)果:


      此時(shí)如果按下Back鍵,系統(tǒng)返回到桌面,并依次執(zhí)行A:onPause -> A:onStop -> A:onDestroy。


      此時(shí)如果按下Home鍵(非長按),系統(tǒng)返回到桌面,并依次執(zhí)行A:onPause -> A:onStop。由此可見,Back鍵和Home鍵主要區(qū)別在于是否會(huì)執(zhí)行onDestroy。


      此時(shí)如果長按Home鍵,不同手機(jī)可能彈出不同內(nèi)容,Activity生命周期未發(fā)生變化(由小米2s測(cè)的,不知道其他手機(jī)是否會(huì)對(duì)Activity生命周期有影響)。


      由于Android本身的特性,使得現(xiàn)在不少應(yīng)用都沒有直接退出應(yīng)用程序的功能,按照一般的邏輯,當(dāng)Activity棧中有且只有一個(gè)Activity時(shí),當(dāng)按下Back鍵此Activity會(huì)執(zhí)行onDestroy,那么下次點(diǎn)擊此應(yīng)用程圖標(biāo)將從重新啟動(dòng),因此,當(dāng)前不少應(yīng)用程序都是采取如Home鍵的效果,當(dāng)點(diǎn)擊了Back鍵,系統(tǒng)返回到桌面,然后點(diǎn)擊應(yīng)用程序圖標(biāo),直接回到之前的Activity界面,這種效果是怎么實(shí)現(xiàn)的呢?


      通過重寫按下Back鍵的回調(diào)函數(shù),轉(zhuǎn)成Home鍵的效果即可。



      @Override
      public void onBackPressed() {
          Intent home = new Intent(Intent.ACTION_MAIN);
          home.addCategory(Intent.CATEGORY_HOME);
          startActivity(home);
      }


      當(dāng)然,此種方式通過Home鍵效果強(qiáng)行影響到Back鍵對(duì)Activity生命周期的影響。注意,此方法只是針對(duì)按Back鍵需要退回到桌面時(shí)的Activity且達(dá)到Home效果才重寫。


      或者,為達(dá)到此類效果,Activity實(shí)際上提供了直接的方法。



      1 activity.moveTaskToBack(true);


      moveTaskToBack()此方法直接將當(dāng)前Activity所在的Task移到后臺(tái),同時(shí)保留activity順序和狀態(tài)。


       


      在之前的項(xiàng)目開發(fā)過程中,當(dāng)時(shí)遇到一個(gè)很奇怪的問題:手機(jī)上的“開發(fā)者選項(xiàng)”中有一個(gè)“不保留活動(dòng)”的設(shè)置,當(dāng)開啟此設(shè)置,手機(jī)上的設(shè)置提示是“用戶離開后即銷毀每個(gè)活動(dòng)”,開啟后,對(duì)于其他的應(yīng)用程序是從A Acticity到B Activity,然后Back鍵回到A,此時(shí),其他應(yīng)用程序只是先白屏(有可能黑屏等,取決于主題設(shè)置)一下,然后A開始可見,但是我的應(yīng)用程序中出現(xiàn)的一個(gè)結(jié)果卻是直接返回到了桌面。一開始百思不得其解。最后終于定位出問題。首先,我們需要明確開啟此設(shè)置項(xiàng)后對(duì)Activity生命周期的影響。開啟此設(shè)置項(xiàng)后,當(dāng)A到B時(shí),假設(shè)B全部遮擋住了A,將依次執(zhí)行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop -> A:onDestroy。是的,A在系統(tǒng)原本的生命周期回調(diào)中增加了onDestroy。此即“用戶離開后即銷毀每個(gè)活動(dòng)”的含義。但此時(shí)需要注意的是,只要沒有認(rèn)為的調(diào)用A的finish()方法,雖然A執(zhí)行了onDestroy,但Activity棧中依然保留有A,此時(shí)B處于棧頂。那么在B中按Back鍵回到A時(shí),將依次執(zhí)行:B:onPause -> A:onCreate -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。沒錯(cuò),A從onCreate開始執(zhí)行了。此處也就解釋了為什么A可能會(huì)出現(xiàn)白屏(或黑屏等)一下的原因了。


      那么為什么我的應(yīng)用程序會(huì)跟其他應(yīng)用程序出現(xiàn)不一樣呢?最后定為出問題在于當(dāng)時(shí)我的應(yīng)用程序中為了做到完全退出應(yīng)用程序效果,專門使用了一個(gè)Activity棧去維護(hù)Activity(當(dāng)時(shí)是借鑒了網(wǎng)上的此類實(shí)現(xiàn)方案,現(xiàn)在想想,實(shí)在沒必要,且不說Android本身特性決定了沒必要通過如此方法去達(dá)到退出效果,僅僅是此方法本身也存在很大的問題,現(xiàn)在在網(wǎng)上依然能見到有不少文章說到應(yīng)用程序退出可以使用此方法,哎。。),在onCreate中入棧,onDestroy出棧,調(diào)用了如下方法



      1 // 結(jié)束Activity&從堆棧中移除
      2 AppManager.getAppManager().finishActivity(this);


      其中,AppManager中finishActivity函數(shù)具體定義是:


      復(fù)制代碼

       1 /**
       2  * 結(jié)束指定的Activity
       3  */
       4 public void finishActivity(Activity activity) {
       5     if (activity != null) {
       6         activityStack.remove(activity);
       7         activity.finish();
       8         activity = null;
       9     }
      10 }

      復(fù)制代碼

      至此,相信大家應(yīng)該看出問題的所在了吧。


      沒錯(cuò),問題在于執(zhí)行了activity的finish()方法!! activity的finish()方法至少有兩個(gè)層面含義,1.將此Activity從Activity棧中移除,2.調(diào)用了此Activity的onDestroy方法。對(duì)于不開啟“不保留活動(dòng)”的設(shè)置項(xiàng),實(shí)際上也沒什么影響,但是一旦開啟此設(shè)置,問題顯露無疑。開啟此此設(shè)置后,正常情況下離開A,即使執(zhí)行了A的onDestroy,Activity棧中還是有A的,但是我這樣寫后,finish()方法一執(zhí)行,Activity棧中就沒有A了,因此,當(dāng)點(diǎn)擊Back鍵時(shí),Activity棧中已經(jīng)沒有此應(yīng)用的任何Activity了,直接來到了手機(jī)桌面。


      可能,有些人會(huì)說,我就是要通過此種方法想去完全退出應(yīng)用程序,同時(shí)希望自己的Activity棧和系統(tǒng)中Activity棧保持一致,怎么辦呢?


      在此,可以通過如下改寫去實(shí)現(xiàn):


       


      復(fù)制代碼

      /**
      * 結(jié)束指定的Activity
       */
      public void finishActivity(Activity activity) {
          if (activity != null) {
          // 為與系統(tǒng)Activity棧保持一致,且考慮到手機(jī)設(shè)置項(xiàng)里的"不保留活動(dòng)"選項(xiàng)引起的Activity生命周期調(diào)用onDestroy()方法所帶來的問題,此處需要作出如下修正
          if(activity.isFinishing()){
              activityStack.remove(activity);
              //activity.finish();
              activity = null;
          }
          }
      }

      復(fù)制代碼

       


      以此謹(jǐn)記!


      -------------------------------------------------


      此外,對(duì)于不同的啟動(dòng)模式或Intent Flags或操作行為(如橫豎屏切換)等有可能會(huì)影響到Activity生命周期,此類問題將放在后續(xù)相關(guān)文章中進(jìn)行總結(jié)。


       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多