(九十六)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。

demo:github 地址

<?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不会有多实例了

如上两个activity分属下面两个TASK

 

3.总结

在同一堆栈中创建标准加载模式的activity,处于最底部的activity是不会重复加载的,也就是不会有多实例的,其他的activity可以创建出多实例。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值