活动的启动模式
activity 有四种启动模式:standard ;singleTop; singleTask singleInstance
可以在androidManifest.xml中的activity中Android:lanuchMode来设置:
standard :
一般我们默认就是standard模式:这种模式下系统不会在乎activity是否已经存在返回栈中,每次启动都会创建一个新的实例.
如:我们默认activityA的启动模式为standard ,A启动A,会再次创建A,所以退出程序时需要按两次back键.
singleTop:
在当前活动已经存在栈顶时,不会创建新的实例,如果不是还会创建实例:
A启动模式为singleTop
如:A-B-A,则会创建两个A实例,因为在B启动A时, B位于栈顶;如果A-A则会只有一个实例.
singleTask :
我们发现singleTop还是会出现多个实例,所以它也不是完全满足我们的需求,这时我们会发现singleTask模式:
每次启动活动的时候,都会在返回栈中检查是否已经存在了,如果不存在则创建; 如果存在的话,将此活动之前的活动退出返回栈,此活动就是栈顶了.
A启动模式为singleTask
如:A-B-A,这种情况返回栈中只有一个A,(B也不在返回栈了).
singleInstance:
这个启动模式与之前的三个都有所不同;会有单独的返回栈,
试想一下:如果我的这个活动是很多应用都会调用到的,那每个应用都有自己的返回栈,也会有这个活动的实例,造成多个实例,singleInstance就是解决这个问题的好办法.
B启动模式为singleInstance
如:A-B-C,这种情况有两个返回栈,一个返回栈中有A和C,另一个单独的B,此时按返回键先从C-A,然后在A-B,最后退出程序.
如何退出程序
如MainActivity打开Main2Activity,在打开Main3Activity,这时退出程序很麻烦,需要按三次返回键.
我们需要一个类来管理我们的活动ActivityCollector
public class ActivityCollector {
public static List<Activity> sActivityList=new ArrayList<>();
public static void AddActivity(Activity activity) {
sActivityList.add(activity);
}
public static void removeActivity(Activity activity) {
sActivityList.remove(activity);
}
public static void FinishAll() {
for (Activity activity : sActivityList) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
创建BaseActvity,继承AppCompatActivity,然后让MainActivity, Main2Activity Main3Activity都继承它
public class BaseActvity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.AddActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
此时在Main3Activity 只要按回退键就退出程序了
public class Main3Activity extends BaseActvity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
@Override
public void onBackPressed() {
super.onBackPressed();
ActivityCollector.FinishAll();
android.os.Process.killProcess(Process.myPid());//杀掉当前进程
}
}