詳解Android中Activity的四大啟動(dòng)模式實(shí)驗(yàn)簡(jiǎn)述
作為Android四大組件之一,Activity可以說(shuō)是最基本也是最常見的組件,它提供了一個(gè)顯示界面,從而實(shí)現(xiàn)與用戶的交互,作為初學(xué)者,必須熟練掌握。今天我們就來(lái)通過(guò)實(shí)驗(yàn)演示,來(lái)幫助大家理解Activity的四大啟動(dòng)模式。
演示效果如下:

第一步:實(shí)驗(yàn)前準(zhǔn)備,相關(guān)配置文件以及Activity的建立
(1)AndroidMainfest.xml配置文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.intentflags">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//另外兩個(gè)activity
<activity android:name=".Main2Activity"> </activity>
<activity android:name=".Main3Activity"></activity>
</application>
</manifest>
(2)layout中三個(gè)activity的三個(gè)布局文件activity_main.xml(這里演示一個(gè),其余兩個(gè)只是下面TextView文字不一樣)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.intentflags.MainActivity">
<Button
android:text="第一個(gè)頁(yè)面"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click1" />
<Button
android:text="第二個(gè)頁(yè)面"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click2" />
<Button
android:text="第三個(gè)頁(yè)面"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click3" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
//其余兩個(gè)僅文字不一樣
android:text="第一個(gè)頁(yè)面"
android:textSize="50sp"/>
</LinearLayout>
(3)java中三個(gè)activity的實(shí)現(xiàn)代碼MainActivity.java(僅演示一個(gè),其他兩個(gè)完全相同)
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
/**
* Created by panchengjia on 2016/12/14.
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//其他兩個(gè)界面此處引用各自對(duì)應(yīng)的layout文件
setContentView(R.layout.activity_main);
}
public void click1(View view){
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
//記錄Taskid用于實(shí)驗(yàn)說(shuō)明
Log.i("Tag","頁(yè)面一taskId:"+getTaskId());
}
public void click2(View view){
Intent intent = new Intent(this,Main2Activity.class);
startActivity(intent);
Log.i("Tag","頁(yè)面二taskId:"+getTaskId());
}
public void click3(View view){
Intent intent = new Intent(this,Main3Activity.class);
startActivity(intent);
Log.i("Tag","頁(yè)面三taskId:"+getTaskId());
}
}
第二步:standard默認(rèn)(標(biāo)準(zhǔn))模式下的演示實(shí)驗(yàn)
默認(rèn)模式,可以不用寫配置。在這個(gè)模式下,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例。因此,在這種模式下,可以有多個(gè)相同的實(shí)例,也允許多個(gè)相同Activity疊加。
我們的操作結(jié)果如下圖:

log圖如下(未記錄回退log):

通過(guò)分析操作圖以及l(fā)og,得出這種Standard模式是每次都會(huì)創(chuàng)建新的Activity對(duì)象,當(dāng)點(diǎn)擊返回按鈕時(shí),他會(huì)將棧頂(當(dāng)前Activity)消滅,然后跳 到下一層,這種模式可能大多數(shù)情況下不是我們需要的,因?yàn)閷?duì)系統(tǒng)性能的消耗過(guò)大。
第三步:singleTop模式下的演示實(shí)驗(yàn)(設(shè)置頁(yè)面二為singleTop)
在當(dāng)前任務(wù)棧中,判斷棧頂是否為當(dāng)前的Activity,如果是,就直接使用,如果不是,再創(chuàng)建新的Activity放入棧頂。
AndroidMainfest.xml中設(shè)置代碼如下:
<activity android:name=".Main2Activity"
android:launchMode="singleTop"> </activity>
我們的操作結(jié)果如下圖:

log圖如下(未記錄回退log):

分析此啟動(dòng)模式和singleTop在名字上即可看出區(qū)別,即singleTop每次只檢測(cè)當(dāng)前棧頂?shù)腁ctivity是否是我們需要請(qǐng)求創(chuàng)建的,而 singleTask則會(huì)檢測(cè)棧中全部的Activity對(duì)象,從上向下,如果檢測(cè)到是我們所請(qǐng)求的則會(huì)消滅此Activity對(duì)象上面的對(duì)象,直接把檢測(cè)到的我們需要的Activity置為棧頂。
第四步:singleTask模式下的演示實(shí)驗(yàn)(設(shè)置頁(yè)面二為singleTask)
在當(dāng)前任務(wù)棧中,判斷棧里是否存在Activity,如果不存在,創(chuàng)建一個(gè)新Activity入棧,如果存在,會(huì)把該Activity之上的所有Activity清除出棧,顯示當(dāng)前Activity。
AndroidMainfest.xml中設(shè)置代碼如下:
<activity android:name=".Main2Activity"
android:launchMode="singleTask"> </activity>
我們的操作結(jié)果如下圖:

log圖如下(未記錄回退log):

只有一個(gè)實(shí)例。在同一個(gè)應(yīng)用程序中啟動(dòng)他的時(shí)候,若Activity不存在,則會(huì)在當(dāng)前task創(chuàng)建一個(gè)新的實(shí)例,若存在,則會(huì)把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法。如果是在別的應(yīng)用程序中啟動(dòng)它,則會(huì)新建一個(gè)task,并在該task中啟動(dòng)這個(gè)Activity,singleTask允許別的Activity與其在一個(gè)task中共存,也就是說(shuō),如果我在這個(gè)singleTask的實(shí)例中再打開新的Activity,這個(gè)新的Activity還是會(huì)在singleTask的實(shí)例的task中。
第五步:singleInstance模式下的演示實(shí)驗(yàn)(設(shè)置頁(yè)面二為singleInstance)
新創(chuàng)建一個(gè)任務(wù)棧,放入新創(chuàng)建的Activity,該任務(wù)棧只允許存在一個(gè)Activity實(shí)例,如果已存在,那么會(huì)切換到該任務(wù)棧。
AndroidMainfest.xml中設(shè)置代碼如下:
<activity android:name=".Main2Activity"
android:launchMode="singleInstance"> </activity>
我們的操作結(jié)果如下圖:
log圖如下(未記錄回退log):

瀏覽器工作原理類似,我們都知道在多個(gè)程序中訪問(wèn)瀏覽器時(shí),如果當(dāng)前瀏覽器沒(méi)有打開,則打開瀏覽器,否則會(huì)在當(dāng)前打開的瀏覽器中訪問(wèn)。此模式會(huì)節(jié)省大量的系統(tǒng)資源,因?yàn)樗鼙WC要請(qǐng)求的Activity對(duì)象在當(dāng)前的棧中只存在一個(gè)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義View實(shí)現(xiàn)九宮格圖形解鎖(Kotlin版)
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)九宮格圖形解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Android編程實(shí)現(xiàn)的簡(jiǎn)易路徑導(dǎo)航條功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)的簡(jiǎn)易路徑導(dǎo)航條功能,結(jié)合實(shí)例形式分析了Android結(jié)合視圖、布局及路徑操作實(shí)現(xiàn)導(dǎo)航條功能的相關(guān)技巧,需要的朋友可以參考下2017-01-01
Kotlin 集合函數(shù)map 和 first 的使用場(chǎng)景分析
Kotlin 提供了許多強(qiáng)大的集合操作函數(shù),其中 map 適用于轉(zhuǎn)換集合,first 適用于獲取符合條件的第一個(gè)元素,這篇文章給大家介紹Kotlin 集合函數(shù):map 和 first 的使用場(chǎng)景,感興趣的朋友一起看看吧2025-04-04
Android仿QQ微信實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)
這篇文章主要為大家詳細(xì)介紹了Android仿QQ微信實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android BottomSheet效果的兩種實(shí)現(xiàn)方式
這篇文章主要介紹了Android BottomSheet效果的兩種實(shí)現(xiàn)方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
android教程之使用popupwindow創(chuàng)建菜單示例
這篇文章主要介紹了android使用popupwindow創(chuàng)建菜單的示例,需要的朋友可以參考下2014-02-02

