(九十六)Android O activity standard mode 探究
1.啟動模式簡介
Activity啟動方式有四種,分別是:
standard
singleTop
singleTask
singleInstance
可以根據實際的需求為Activity設定對應的啟動模式,從而可以避免建立大量重複的Activity等問題。
設定Activity的啟動模式,只需要在AndroidManifest.xml裡對應的<activity>標籤設定android:launchMode屬性,例如:
<activity
android:name=".A1"
android:launchMode="standard" />
今天主要探究下launchMode為standard時activity啟動問題。
2.Demo
程式碼很簡單就是簡單的apk裡面聲明瞭兩個空的activity,launchMode不指定,預設為standard。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo_96_activitystandardmode"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" 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> <activity android:name=".Main2Activity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="com.example.test.activity2" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".Main3Activity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="com.example.test.activity3" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
package com.example.demo_96_activitystandardmode; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
package com.example.demo_96_activitystandardmode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}
package com.example.demo_96_activitystandardmode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class Main3Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
}
3.測試
首先啟動activity2,再次啟動提示“Warning: Activity not started, its current task has been brought to the front”;
之後啟動activity3,嘗試啟動3次,均會重新建立。
使用dumpsys activity com.example.demo_96_activitystandardmode | grep "ACTIVITY com.example.demo_96_activitystandardmode"
顯示堆疊資訊
堆疊資訊表示堆疊從底往上是 2-3-3-3
2是在堆疊底部,雖然是standard mode,但是重新呼叫並不會對此建立
3不是在堆疊底部,重新呼叫會重新建立
修改下activity3的
<activity
android:name=".Main3Activity"
android:taskAffinity="">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="com.example.test.activity3" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
重新測試
發現activity3也不能重新建立了
檢視下堆疊資訊,有兩個和之前不一樣的現象
1)最近任務可以看到demo的兩個視窗,之前是一個,表示現在有兩個堆疊了
2)activity3不會有多例項了
3.總結
在同一堆疊中建立標準載入模式的activity,處於最底部的activity是不會重複載入的,也就是不會有多例項的,其他的activity可以創建出多例項。