1. 程式人生 > >(九十六)Android O activity standard mode 探究

(九十六)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可以創建出多例項。