android 的四种启动模式

来源:互联网 发布:fzltchjw gb1 0 mac 编辑:程序博客网 时间:2024/05/02 05:04

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   onCreate10-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   onCreate10-26 17:52:41.080 18824-18824/com.myanimationapplication I/tag: MainActivity  onNewIntent10-26 17:52:41.081 18824-18824/com.myanimationapplication I/tag: MainActivity  onRestart10-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的栈中而是会新建一个栈。

1 0