作為Android四大組件之一,Activity可以說是最基本也是最常見的組件,它提供了一個顯示界面,從而實現與用戶的交互,作為初學者,必須熟練掌握。今天我們就來通過實驗演示,來幫助大家理解Activity的四大啟動模式。 演示效果如下: 第一步:實驗前準備,相關配置文件以及Activity的建立 ...
作為Android四大組件之一,Activity可以說是最基本也是最常見的組件,它提供了一個顯示界面,從而實現與用戶的交互,作為初學者,必須熟練掌握。今天我們就來通過實驗演示,來幫助大家理解Activity的四大啟動模式。
演示效果如下:
第一步:實驗前準備,相關配置文件以及Activity的建立
(1)AndroidMainfest.xml配置文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.administrator.intentflags"> 4 <application 5 android:allowBackup="true" 6 android:icon="@mipmap/ic_launcher" 7 android:label="@string/app_name" 8 android:supportsRtl="true" 9 android:theme="@style/AppTheme"> 10 <activity android:name=".MainActivity"> 11 <intent-filter> 12 <action android:name="android.intent.action.MAIN" /> 13 14 <category android:name="android.intent.category.LAUNCHER" /> 15 </intent-filter> 16 </activity> 17 //另外兩個activity 18 <activity android:name=".Main2Activity"> </activity> 19 <activity android:name=".Main3Activity"></activity> 20 </application> 21 </manifest>
(2)layout中三個activity的三個佈局文件activity_main.xml(這裡演示一個,其餘兩個只是下麵TextView文字不一樣)
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/activity_main" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:orientation="vertical" 9 tools:context="com.example.administrator.intentflags.MainActivity"> 10 <Button 11 android:text="第一個頁面" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:onClick="click1" /> 15 <Button 16 android:text="第二個頁面" 17 android:layout_width="match_parent" 18 android:layout_height="wrap_content" 19 android:onClick="click2" /> 20 <Button 21 android:text="第三個頁面" 22 android:layout_width="match_parent" 23 android:layout_height="wrap_content" 24 android:onClick="click3" /> 25 <TextView 26 android:layout_width="match_parent" 27 android:layout_height="match_parent" 28 //其餘兩個僅文字不一樣 29 android:text="第一個頁面" 30 android:textSize="50sp"/> 31 </LinearLayout>
(3)java中三個activity的實現代碼MainActivity.java(僅演示一個,其他兩個完全相同)
1 import android.content.Intent; 2 import android.support.v7.app.AppCompatActivity; 3 import android.os.Bundle; 4 import android.util.Log; 5 import android.view.View; 6 /** 7 * Created by panchengjia on 2016/12/14. 8 */ 9 public class MainActivity extends AppCompatActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 //其他兩個界面此處引用各自對應的layout文件 15 setContentView(R.layout.activity_main); 16 } 17 public void click1(View view){ 18 Intent intent = new Intent(this,MainActivity.class); 19 startActivity(intent); 20 //記錄Taskid用於實驗說明 21 Log.i("Tag","頁面一taskId:"+getTaskId()); 22 } 23 public void click2(View view){ 24 Intent intent = new Intent(this,Main2Activity.class); 25 startActivity(intent); 26 Log.i("Tag","頁面二taskId:"+getTaskId()); 27 } 28 public void click3(View view){ 29 Intent intent = new Intent(this,Main3Activity.class); 30 startActivity(intent); 31 Log.i("Tag","頁面三taskId:"+getTaskId()); 32 } 33 }
第二步:standard預設(標準)模式下的演示實驗
預設模式,可以不用寫配置。在這個模式下,都會預設創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。
我們的操作結果如下圖:
log圖如下(未記錄回退log):
通過分析操作圖以及log,得出這種Standard模式是每次都會創建新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳 到下一層,這種模式可能大多數情況下不是我們需要的,因為對系統性能的消耗過大。
第三步:singleTop模式下的演示實驗(設置頁面二為singleTop)
在當前任務棧中,判斷棧頂是否為當前的Activity,如果是,就直接使用,如果不是,再創建新的Activity放入棧頂。
AndroidMainfest.xml中設置代碼如下:
1 <activity android:name=".Main2Activity" 2 android:launchMode="singleTop"> </activity>
我們的操作結果如下圖:
log圖如下(未記錄回退log):
分析此啟動模式和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求創建的,而 singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢測到的我們需要的Activity置為棧頂。
第四步:singleTask模式下的演示實驗(設置頁面二為singleTask)
在當前任務棧中,判斷棧里是否存在Activity,如果不存在,創建一個新Activity入棧,如果存在,會把該Activity之上的所有Activity清除出棧,顯示當前Activity。
AndroidMainfest.xml中設置代碼如下:
1 <activity android:name=".Main2Activity" 2 android:launchMode="singleTask"> </activity>
我們的操作結果如下圖:
log圖如下(未記錄回退log):
只有一個實例。在同一個應用程式中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。如果是在別的應用程式中啟動它,則會新建一個task,併在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的實例中再打開新的Activity,這個新的Activity還是會在singleTask的實例的task中。
第五步:singleInstance模式下的演示實驗(設置頁面二為singleInstance)
新創建一個任務棧,放入新創建的Activity,該任務棧只允許存在一個Activity實例,如果已存在,那麼會切換到該任務棧。
AndroidMainfest.xml中設置代碼如下:
1 <activity android:name=".Main2Activity" 2 android:launchMode="singleInstance"> </activity>
我們的操作結果如下圖:
log圖如下(未記錄回退log):
瀏覽器工作原理類似,我們都知道在多個程式中訪問瀏覽器時,如果當前瀏覽器沒有打開,則打開瀏覽器,否則會在當前打開的瀏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。