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可以创建出多实例。