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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Activity的启动模式及对生命周期的影响

發布時間:2025/5/22 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Activity的启动模式及对生命周期的影响 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Activity的啟動模式

官網解釋鏈接
(tips:在閱讀此文章前,應先對Activity生命周期掌握)
在每一個程序的main目錄下有一個AndroidManifest.xml文件,這個文件是用來配置Activity的,在配置Activity時可指定android:launchMode 屬性,該屬性用于配置該Activity的啟動模式(或稱加載模式)。
eg:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.testapp1"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.TestApp1"><activity android:name=".activity.MainActivity" android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".activity.NextActivity" /><activity android:name=".activity.PersonActivity" android:launchMode="singleTop" /></application></manifest>

android:launchMode 屬性支持如下4個屬性值:

  • standard:標準模式,這也是默認的加載模式。
  • singleTop:Task棧頂單列模式。
  • singleTask:Task內單列模式。
  • singleInstance:全局單列模式。

Activity的啟動模式負責管理實例化、啟動Activity的方式,并可以控制Activity與Task之間的加載關系。
Task可以理解為Activity棧,Task以棧的形式來管理Activity,并且先啟動的Activity被放入棧底,后啟動的Activity被置于棧頂。

standard模式以及對Activity生命周期的影響

啟動Activity時,Android都會為目標Activity創建一個新的實例,并添加在當前的Task棧中。特點:一直啟動新的Activity實例并且不會啟動新的Task。
MainActivity部分代碼:

findViewById(R.id.imageButton).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(view.getContext(), PersonActivity.class);view.getContext().startActivity(intent);}});

PersonActivity部分代碼:

findViewById(R.id.imageView2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(view.getContext(), MainActivity.class);view.getContext().startActivity(intent);}});

上面兩段代碼意思是在MainActivity中點擊id為imageButton的按鈕時,啟動PersonActivity;在PersonActivity中點擊id為imageView2的控件時,啟動MainActivity。
在AndroidManifest.xml中設置MainActivity和PersonActivity的啟動模式為standard:

<activity android:name=".activity.MainActivity" android:launchMode="standard" > <activity android:name=".activity.PersonActivity" android:launchMode="standard" />

運行程序,進入MainActivity,點擊按鈕啟動PersonActivity,進入PersonActivity,點擊圖片控件啟動MainActivity,進入MainActivity,再次點擊按鈕啟動PersonActivity觀察其生命周期的變化:
MainActivity實例1:onCreate()->
MainActivity實例1:onStart()->
MainActivity實例1:onResume()->
此時點擊按鈕->
MainActivity實例1:onPause()->
PersonActivity()實例1:onCreate()->
PersonActivity實例1:onStart()->
PersonActivity實例1:onResume()->
MainActivity實例1:onStop()->
此時點擊圖片控件->
PersonActivity實例1:onPause()->
MainActivity實例2:onCreate()->
MainActivity實例2:onStart()->
MainActivity實例2:onResume()->
PersonActivity實例1:onStop()->
此時點擊按鈕->
MainActivity實例2:onPause()->
PersonActivity()實例2:onCreate()->
PersonActivity實例2:onStart()->
PersonActivity實例2:onResume()->
MainActivity實例2:onStop()

上述生命周期加粗處以及圖片標記顏色處發現:在同一個Activity對的實例未銷毀,卻進行的是onCreate()而不是onRestart()。因此,在標準模式下,Activity創建了新的對象加入Task棧頂,原來的實例在Task棧內。(不同Activity實例的hashCode值有差異,但它們所在的TaskID總是相同的,表明標準模式不會使用新的Task)

singleTop模式以及對Activity生命周期的影響

singleTop模式與standard模式類似,不同點在于singleTop模式時,若需啟動的目標Activity已經位于Task棧頂時,系統不會重新創建目標Activity的實例,而是復用已有位于棧頂Activity實例。
其對于Activity生命周期的影響與standard模式不同的時,當動的目標Activity已經位于Task棧頂時,不會onCreate(),而是onRestart()。其他情況與standard模式保持一致,在此不做詳細敘述。

singleTask模式以及對Activity生命周期的影響

采用singleTask這種加載模式的Activity能保證在同一個Task內只有某個Activity的一個實例,當系統采用singleTask 模式啟動目標Activity時,可分為如下三種情況:

  • 如果將要啟動的目標Activity不存在,系統將會創建目標Activity的實例,并將它加入Task棧頂。
  • 如果將要啟動的目標Activity已經位于Task棧頂,此時與singleTop模式的行為相同。
  • 如果將要啟動的目標Activity已經存在、但沒有位于Task棧頂,系統將會把位于該Activity上面的所有Activity移出Task棧,從而使得目標Activity轉入棧頂。
  • 代碼參考standard模式中貼的代碼,其中將MainActivity與PersonActivity的啟動模式設置為android:launchMode=“singleTask”
    觀察在singleTask模式下對Activity生命周期的影響:
    MainActivity:onCreate()->
    MainActivity:onStart()->
    MainActivity:onResume()->
    此時點擊按鈕->
    MainActivity:onPause()->
    PersonActivity():onCreate()->
    PersonActivity:onStart()->
    PersonActivity:onResume()->
    MainActivity:onStop()->
    此時點擊圖片控件->
    PersonActivity:onPause()->
    MainActivity:onRestart()->
    MainActivity:onStart()->
    MainActivity:onResume()->
    PersonActivity:onStop()->

    上述生命周期加粗處以及圖片標記顏色處發現:啟動目標Activity在Task棧中存在時,會直接啟動已存在的Activity的實例復用,并且會銷毀Task棧中在此Activity實例上的Activity實例。

    singleInstance模式以及對Activity生命周期的影響

    在singlelInstance這種啟動(加載)模式下,系統保證無論從哪個Task中啟動目標Activity,只會創建一個目標Activity實例,并會使用一個全新的Task 棧來加載該Activity實例。
    當系統采用 singleInstance模式啟動目標Activity時,可分為如下兩種情況。

    • 如果將要啟動的目標Activity不存在,系統會先創建一個全新的Task,再創建目標Activity的實例,并將它加入新的Task棧頂。
    • 如果將要啟動的目標Activity已經存在,無論它位于哪個應用程序中、位于哪個Task中,系統都會把該Activity所在的Task轉到前臺,從而使該Activity顯示出來。

    需要指出的是,采用singleInstance模式加載Activity總是位于Task 棧頂,且采用singleInstance模式加載的Activity所在Task將只包含該Activity。
    觀察在singleInstance模式下對Activity生命周期的影響:

    從圖中可以看出,singleInstance模式下,啟動MainActivity時,創建了Task,并將MainActivity的實例放入Task棧中(只有一個故位于棧頂);啟動PersonActivity時,創建了新的Task,并將PersonActivity的實例放入新Task中(只有一個故位于棧頂),新Task位于前臺,原Task置于后臺;再啟動MainActivity時,由于其之前已經存在,將其位于的原Task轉入前臺,因在棧頂,直接展示。

    總結

    以上是生活随笔為你收集整理的Android Activity的启动模式及对生命周期的影响的全部內容,希望文章能夠幫你解決所遇到的問題。

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