日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Activity生命周期的学习和验证

發布時間:2024/9/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Activity生命周期的学习和验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.引子

Activity就像是英文詞匯本的Abandon,開篇就能碰到,關于Activity生命周期的博客教程非常多,側面說明Activity非常重要,其中的Activity的生命周期又是重中之重,面試官非常喜歡拿這個作為考點,因為掌握Activity生命周期對提高應用的健壯性具有很大的幫助。因為只看教程不自己總結實踐的話,對其理解總會差點意思,自己動手總結了印象才深刻。

2.Activity生命周期

一個Activity具有四個狀態:

  • 活動(active)或運行(running)狀態:此時Activity位于棧頂,用戶可以與之交互;
  • 可見(visible)狀態:該狀態下Activity對用戶可見,但失去了焦點,例如彈出一個對話框,對話框變成前景,原Activity變成背景板,進入可見狀態,此時Activity還是活著的,一旦對話框消失,Activity立刻回到活動狀態;
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q97Zcg70-1586575759198)(./assets/可見.png)]
  • 停止(stopped)或隱藏(hidden)狀態:如果一個Activity完全被另一個Activity遮蓋,則進入該狀態,該狀態下Activity仍保留著原先的狀態信息,再次回到前臺直接使用這些保留的信息,例如你從知乎的某個答案跳轉到微博界面,此時知乎界面是停止狀態,當你再次回到知乎界面時,因為保留了跳轉時的狀態,再次回到知乎界面還是你之前瀏覽的答案,注意,在停止狀態下,如果系統資源緊張的話,則會銷毀Activity,當然會把所有Activity保留的狀態信息也清除了,這個時候再次回到知乎界面,只能是看一遍開屏廣告再從首頁開始吧;
  • 銷毀(destroyed)狀態:系統終止Activity進程,在內存層面刪除Activity。現在安卓手機的清理緩存功能其中一個功能是銷毀堆棧中的Activity回收資源。當這個Activity再次向用戶展示時,是重新創建后的實例了。就像她還是她,但已經不是你認識的她。
  • Activity生命周期其實是一個有限狀態機,描述Activity對象如何在以上4種狀態之間轉換的,生命周期如圖所示,圖中矩形表示當Activity狀態跳轉時執行的回調方法。彩色橢圓矩形是Activity可以進入的主要狀態,當然細心的同學會疑惑,彩色橢圓矩形里寫的主要狀態和4種狀態對不上了,例如沒見可見狀態啊,個人認為彩色橢圓矩形指的是Activity動作狀態,例如啟動,運行,銷毀,而上述4種狀態是所處的靜態狀態,在周期圖里用文字描述里,例如Activity進入可見狀態,用The Activity is no longer visible來描述了。
    這個圖我們也許見過多次,跟詞匯本老朋友Abandon一樣,這個圖非常重要,掌握了這個圖,才能叫掌握Activity。

    Activity生命周期有三種類型,其一是Activity的整個生命周期(entire lifetime),從onCreate()開始,到onDestroy()結束,也就是從出生到死亡,貫穿了Activity平庸的一生,Activity在onCreate()中完成所有全局狀態設置,在onDestroy()中釋放所有Activity資源;

    其二是可見生命周期(visible lifetime),發生在onStart()到onStop()之間,如圖所示,為什么叫可見生命周期,這是因為周期開始onStart()和結束onStop()Activity處于可見狀態,不過處于可見狀態Activity還不能和用戶進行交互,只能遠觀。我們發現其實可見生命周期大多數步驟還是和整個生命周期步驟是重合的,為何還單獨提出來呢?因為周期的側重點不同,在可見生命周期內可重點管理給用戶顯示所需的資源,例如UI的更改,而整個生命周期則可重點管理維護貫穿整個生命周期的資源。

    最后是前臺生命周期(foreground lifetime),發生在onResume()到onPause之間在此期間,Activity處于運行狀態,能夠與用戶進行交互。Activity頻繁在onResume和onPause之間進行切換-例如設備鎖屏和解鎖,Activity被其他Activity覆蓋和恢復等,因為頻繁切換,所以應避免在這個生命周期內執行過多的代碼,避免界面卡頓。

    我們注意到,這三個生命周期發生的頻度是逐漸增加的,就像時鐘的三根針,整個生命周期是時針,步驟最長最多,發生的頻度較低,可見生命周期是分針,步驟少一點,前臺生命周期是秒針,步驟最少,發生的頻度最高,開發者應根據這三類生命周期的特點,合理安排Activity所需資源的加載。

    3.生命周期回調方法

    3.1 生命周期回調方法介紹

    我們來看一下生命周期里每一個環節的回調方法

  • onCreate()
      Activity第一次創建時調用該方法,可在該方法中完成Activity初始化操作,例如創建視圖,綁定按鈕事件或其他全局性的資源加載。這是Activity整個生命周期的開始。

  • onStart()
    當活動對用戶可見時調用,是Activity可見生命周期的開始。

  • onResume()
    當Activity開始與用戶互動時調用。 此時Activity位于堆棧的頂部并處于運行狀態。是Activity前臺生命周期的開始。

  • onPause()
      當Activity失去焦點或者即將隱藏/停止或銷毀時調用,執行該方法期間Activity對用戶仍可見,直到另一個Activity覆蓋,一個比較相似的例子是游戲加載,在加載完新場景之前原場景一直對玩家顯示,不過為了不能讓玩家覺得是死機了,加載場景會切換成過場片段或者過場畫面例如展示一下游戲技巧等給玩家知道游戲沒有死機,同樣道理,onPause()一樣是執行過場的動作,官方推薦調用這個方法時讓UI保持活動,同時方法內要執行的操作盡可能輕量化,別做太多的耗時操作。

  • onStop()
    當Activity對用戶完全不可見時調用,例如另一個Activity在棧頂,完全覆蓋了當前的Activity,或者該Activity正在被銷毀。該回調方法和onPause()方法的主要區別在于,如果啟動的新Activity是一個對話框式的activity,那么,onPause()方法會得到執行,而onStop()方法并不會執行。

  • onDestory()
      這個回調方法在Activity被銷毀之前調用。

  • onRestart()
    在Activity停止之后,再次啟動之前調用,始終跟隨onStart()。

  • 3.2 生命周期回調方法示例

    我們在每個回調方法里添加log監控每個回調方法的運行情況,代碼如下,然后再來執行各種操作看Activity生命周期。

    package com.test.activitydemo;import androidx.appcompat.app.AppCompatActivity;import android.app.AlertDialog; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;public class MainActivity extends AppCompatActivity {Button bclick;TextView tv;String TAG="Activity Life";//@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bclick=findViewById(R.id.button);tv=findViewById(R.id.textView);tv.setText("活動狀態");Log.e(TAG, "start onCreate");bclick.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {tv.setText("可見狀態");AlertDialog alertDialog1 = new AlertDialog.Builder(MainActivity.this).setTitle("彈框")//標題.setMessage("彈框變成前景,驗證onPaus是否執行")//內容.setIcon(R.mipmap.ic_launcher)//圖標.create();alertDialog1.show();}});}// 當活動對用戶可見時調用,Activity可見生命周期的開始。@Overrideprotected void onStart(){super.onStart();Log.e(TAG, "start onStart");}// 在Activity停止之后,再次啟動之前調用,其后是onStart(),也就是可見生命周期開始.@Overrideprotected void onRestart(){super.onRestart();Log.e(TAG, "start onRestart");}// 前臺生命周期開始@Overrideprotected void onResume(){super.onResume();Log.e(TAG, "start onResume");}// 前臺生命周期結束前調用@Overrideprotected void onPause(){super.onPause();Log.e(TAG, "start onPause");}// 可見生命周期結束即將結束前調用@Overrideprotected void onStop(){super.onStop();Log.e(TAG, "start onStop");}// 銷毀前調用.@Overrideprotected void onDestroy(){super.onDestroy();Log.e(TAG, "start onDestroy");} }
  • 首先是啟動demo,我們看到Activity逐一調用了onCreate(),onStart(),onResume(),然后進入Activity界面,對應Activity整個生命周期的前三個回調函數;
  • 然后我們點擊按鈕,在Activity上彈個框,看看是否回調onPause(),結束前臺生命周期。我們看到,有彈框在Activity之上,但并沒有回調onPause(),也就是說,Activity沒有結束前臺生命周期,當前Activity還是在棧頂,不是說有彈框部分覆蓋Activity,Activity失去焦點后結束前臺生命周期嗎,這是怎么回事?這是因為創建的AlertDialog對話框有一個context類型的參數,該參數表示AlertDialog是在Activity的上下文創建的,表示彈出的AlertDialog仍屬于當前Activity,Activity沒退居幕后,所以不會執行onPause().那怎樣的彈框才能進入onPause()呢?只能是偽裝成彈框的Activity了。為什么需要是彈框式Activity,普通的Activity是否可行?普通的Activity完全覆蓋了當前的Activity,當前Activity不可見了,彈框式Activity沒有完全覆蓋當前Activity,Activity結束前臺生命周期,但仍然可見。

    將普通Activity變成彈框式,只需要修改主題(Theme)成彈框主題即可,彈框主題在style.xml里設置,代碼如下
  • <style name="dialogstyle"><!--設置dialog的背景--><item name="android:windowBackground">@android:color/transparent</item><!--設置Dialog的windowFrame框為無--><item name="android:windowFrame">@null</item><!--設置無標題--><item name="android:windowNoTitle">true</item><!--是否浮現在activity之上--><item name="android:windowIsFloating">true</item><!--是否半透明--><item name="android:windowIsTranslucent">true</item><!--設置窗口內容不覆蓋--><item name="android:windowContentOverlay">@null</item><!--設置動畫,在這里使用讓它繼承系統的Animation.Dialog--><item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item><!--背景是否模糊顯示--><item name="android:backgroundDimEnabled">true</item> </style>

    然后在AndroidManifest.xml里修改Activity主題

    <activityandroid:name=".AlertDialogActiviy"android:theme="@style/dialogstyle" />

    最后在代碼中實現跳轉

    Intent intent = new Intent(MainActivity.this, AlertDialogActiviy.class);startActivity(intent);

    這樣我們打開Activity彈框時,原Activity仍可見,我們看logcat,可看到已經調用onPause(),表示結束了前臺生命周期。我們點導航欄的返回鍵,回到原Activity界面,則回調onResume方法,重新進入前臺生命周期。


    3. 現在來看下可見生命周期的示例。這個比較簡單,只要調用另外一個Activity或者回調桌面(桌面其實也是一個Activity)即可,只要讓我們的Activity不可見就行。為了方便(偷懶),我用回到桌面來驗證,驗證的logcat截圖如下,可以看到,首先回調onPause(),隨著Activity消失,桌面完全顯示,最后回調onStop(),正式結束可見生命周期。

    然后我們再從桌面回到Activity,logcat截圖如下,首先回調onRestart(),宣布復活,然后是onStart(),進入可見生命周期,最后調用onResume(),進入前臺生命周期。

    4. 最后看銷毀Activity的回調方法,操作方法很簡單,殺掉Activity即可調用,不再贅述。

    總結

    以上是生活随笔為你收集整理的Activity生命周期的学习和验证的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。