activity的启动模式很简单,只有四种:
1.standard,标准模式也是默认模式。
android:launchMode="standard"当你在清单文件中没有给activity设置启动模式时,默认的就是standard模式。该模式有一个特点就是在一个app的activity栈中可以存在多个。
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
每运行一次
startActivity()方法时,栈中就会出现一个activity的实例
2.当一个activity的实例在栈顶的时候,不想在添加该activity的实例,我们还可以选择第二种activity的启动模式,
android:launchMode="singleTop"再次运行startactivity方法时,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", "MainActivity onCreate");
initview();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.i("tag", "MainActivity onNewIntent");
}
打印结果:
10-26 17:39:57.806 6260-6260/com.myanimationapplication I/tag: MainActivity onCreate
10-26 17:40:02.615 6260-6260/com.myanimationapplication I/tag: MainActivity onNewIntent
可以看到程序没走
onCreate,只是走了onnewintent方法,
但是当栈顶不是该activity的实例时,跳转到MainActivity 时程序还是会走oncreate方法的
3.假如我想无论跳转到mainactivity多少次,这个栈中只有一个mainactivity实例,应该怎么破?这样我们就需要用到第三种启动模式,
android:launchMode="singleTask"当mainactivity设置为singletask启动模式时,无论从哪个activity跳到 mainactivity,程序都不回再次走oncreate方法,而且还会把栈中mainactivity实例上端的其他activity实例销毁掉,
mainactivity代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", "MainActivity onCreate");
initview();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.i("tag", "MainActivity onNewIntent");
}
MySecondActivity代码重写一个ondestroy方法,如下:
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("tag", "MySecondActivity onDestroy");
}
打印结果:
10-26 17:51:35.080 18824-18824/? I/tag: MainActivity onCreate
10-26 17:52:41.080 18824-18824/com.myanimationapplication I/tag: MainActivity onNewIntent
10-26 17:52:41.081 18824-18824/com.myanimationapplication I/tag: MainActivity onRestart
10-26 17:52:41.410 18824-18824/com.myanimationapplication I/tag: MySecondActivity onDestroy
可以看出日志纸打印了一次oncreate,在跳回
MainActivity时走了
onNewIntent方法和onRestart方法,而且
MySecondActivity调用了ondestroy
<span style="font-family: Arial, Helvetica, sans-serif;">4.第四种启动模式:
</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Consolas';font-size:12.0pt;"><span style="color:#9876aa;">android</span><span style="color:#bababa;">:launchMode=</span><span style="color:#6a8759;">"singleInstance"</span>
之前的三种启动模式只是app内部的交互,singleInstance模式就涉及到和其他的app进行交互。设置为这种模式的activity就可以和其他的app共享这个activity。该activity的实例不会出现在
该app的栈中而是会新建一个栈。