Android开发艺术探索-Activity的启动模式

来源:互联网 发布:2016双十一大数据 编辑:程序博客网 时间:2024/05/30 19:34

目录

  1. standard–标准模式
  2. singleTop–栈顶复用模式
  3. singleTask—栈内复用模式
  4. singleInstance–单实例模式
    android的任务栈,是一个后进显出的模式,每按一下back键,就会有一个activity出栈,

standard–标准模式

系统默认的模式,每次启动一个activity都会创建一个新的activity实例,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈,在这种模式下,谁启动了这个activity,那么这个activity就在谁的任务栈中,非activity类型的context,并没有所谓的任务栈,所以在用intent进行acitivity之间的跳转的时候,是不能传入Application的context。

singleTop–栈顶复用模式

在这种模式下,如果新Activity已经位于任务栈道栈顶,那么此Activity不会被重新传家,同时onNewIntent方法会被回调,而且这个Activity的onCreate,onStart不会被系统调用,因为它并没有发生便会,如从MainActivity,进入到SecondActivity(singleTop启动模式),此时SecondActivity位于任务栈的栈顶,在然后通过SecondActivity,跳转到SecondActivity,此时如果SecondActivity不是singleTop启动模式,而是系统默认的启动模式的话,那么任务栈从下往上应该是MainActivity–>SecondActivity—>SecondActivity,但是如果是singleTop模式启动的话,那么任务栈从下往上应该是MainActivity–>SecondActivity,

09-05 10:00:56.519 13884-13884/com.example.nbcei.androidart E/main: onNewIntent: 209-05 10:00:56.520 13884-13884/com.example.nbcei.androidart E/main: onResume:2 09-05 10:01:08.273 13884-13884/com.example.nbcei.androidart E/main: onPause: 209-05 10:01:08.273 13884-13884/com.example.nbcei.androidart E/main: onNewIntent: 209-05 10:01:08.274 13884-13884/com.example.nbcei.androidart E/main: onResume:2 

可以看到SecondActivity并没有重新创建,也没有销毁,重新打开的时候调用onNewIntent,onResume,又重新进入SecondActivity的时候,由于SecondActivity已经存在,并不会调用onCreate,onRestart,onStart等方法,由此可知,当Activity的启动模式是栈顶复用模式时,而且Activity位于栈顶,离开这个activity又重新进入到这个Activity的时候,会依次调用onPause,onNewIntent,onResume,其他的生命周期方法不会调用

singleTask—栈内复用模式

这是一种单实例模式,只要位于Activity的任务栈中,就不会重新创建这个Activity的实例,二期栈内复用模式,有clearTask的功能,会把其他的栈顶activity出栈(相当于销毁activity),自己进入栈顶,和栈顶复用模式一样,只会调用onNewIntent,onResume,onPause,其他的生命周期方法只有在activity销毁的时候才会调用,举个栗子,从MainActivity(singleTask),进入到SecondActivity(默认模式),然后关闭SecondActivity,分析下各个activity的生命周期的方法调用:
MainActivity创建调用:onCreate–>onStart—>onResume
进入到SecondActivity:onPause–>onCreate2–>onStart2–>onResume2–>onStop
关闭SecondActivity:onPause2–>onReStart–>onStart–>onResume–>onStop2–>onDestroy2

09-05 10:23:59.974 4711-4711/com.example.nbcei.androidart E/main: onCreate: 09-05 10:24:00.079 4711-4711/com.example.nbcei.androidart E/main: onStart: 09-05 10:24:00.083 4711-4711/com.example.nbcei.androidart E/main: onResume: 09-05 10:24:01.789 4711-4711/com.example.nbcei.androidart E/main: onPause: 09-05 10:24:01.815 4711-4711/com.example.nbcei.androidart E/main: onCreate: 209-05 10:24:01.821 4711-4711/com.example.nbcei.androidart E/main: onStart:2 09-05 10:24:01.824 4711-4711/com.example.nbcei.androidart E/main: onResume:2 09-05 10:24:02.134 4711-4711/com.example.nbcei.androidart E/main: onStop: 09-05 10:24:04.056 4711-4711/com.example.nbcei.androidart E/main: onPause: 209-05 10:24:04.063 4711-4711/com.example.nbcei.androidart E/main: onRestart: 09-05 10:24:04.063 4711-4711/com.example.nbcei.androidart E/main: onStart: 09-05 10:24:04.064 4711-4711/com.example.nbcei.androidart E/main: onResume: 09-05 10:24:04.410 4711-4711/com.example.nbcei.androidart E/main: onStop:2 09-05 10:24:04.411 4711-4711/com.example.nbcei.androidart E/main: onDestroy:2 

当SecondAcitivty调用finish方法,关闭自己的时候 这个时任务栈从MainAcitivty–>SecondAcitivty,变成了MainAcitivty,这个变化过程是SecondAcitivty自动出栈,MainAcitivty自动位于栈顶,这个时候MainAcitivty不会调用onNewIntent,而是从onRestart方法开始,重新打开


从MainActivity(singleTask),进入到SecondActivity(默认模式),然后从SecondActivity跳转到MainActivity,分析下各个activity的生命周期的方法调
用:
MainActivity创建调用:onCreate–>onStart—>onResume
进入到SecondActivity:onPause–>onCreate2–>onStart2–>onResume2–>onStop
从SecondActivity跳转到MainActivity:onPause2–>onNewIntent–>onReStart–>onStart–>onResume–>onStop2–>onDestroy2

日志:

09-05 10:38:45.685 18568-18568/com.example.nbcei.androidart E/main: onCreate: 09-05 10:38:45.778 18568-18568/com.example.nbcei.androidart E/main: onStart: 09-05 10:38:45.782 18568-18568/com.example.nbcei.androidart E/main: onResume: 09-05 10:38:49.149 18568-18568/com.example.nbcei.androidart E/main: onPause: 09-05 10:38:49.198 18568-18568/com.example.nbcei.androidart E/main: onCreate: 209-05 10:38:49.207 18568-18568/com.example.nbcei.androidart E/main: onStart:2 09-05 10:38:49.210 18568-18568/com.example.nbcei.androidart E/main: onResume:2 09-05 10:38:49.787 18568-18568/com.example.nbcei.androidart E/main: onStop: 09-05 10:38:51.952 18568-18568/com.example.nbcei.androidart E/main: onPause: 209-05 10:38:51.965 18568-18568/com.example.nbcei.androidart E/main: onNewIntent: 09-05 10:38:51.968 18568-18568/com.example.nbcei.androidart E/main: onRestart: 09-05 10:38:51.971 18568-18568/com.example.nbcei.androidart E/main: onStart: 09-05 10:38:51.972 18568-18568/com.example.nbcei.androidart E/main: onResume: 09-05 10:38:52.545 18568-18568/com.example.nbcei.androidart E/main: onStop:2 

区别就是从SecondActivity跳转到MainActivity的时候任务栈从从MainActivity–>SecondActivity,变成了SecondActivity->MainActivity,所以会MainActivity的onNewIntent会调用。

singleInstance–单实例模式

单实例模式,这是一种加强的singleTask模式,具有singleTask的所有特征,只不过singleInstance启动的activity会单独的处于一个任务栈中,由于栈顶复用的特性后续的请求,都不会创建这个实例,除非任务栈销毁,举个栗子:

09-05 10:38:45.685 18568-18568/com.example.nbcei.androidart E/main: onCreate: 09-05 10:38:45.778 18568-18568/com.example.nbcei.androidart E/main: onStart: 09-05 10:38:45.782 18568-18568/com.example.nbcei.androidart E/main: onResume: 09-05 10:38:49.149 18568-18568/com.example.nbcei.androidart E/main: onPause: 09-05 10:38:49.198 18568-18568/com.example.nbcei.androidart E/main: onCreate: 209-05 10:38:49.207 18568-18568/com.example.nbcei.androidart E/main: onStart:2 09-05 10:38:49.210 18568-18568/com.example.nbcei.androidart E/main: onResume:2 09-05 10:38:49.787 18568-18568/com.example.nbcei.androidart E/main: onStop: 09-05 10:38:51.952 18568-18568/com.example.nbcei.androidart E/main: onPause: 209-05 10:38:51.965 18568-18568/com.example.nbcei.androidart E/main: onNewIntent: 09-05 10:38:51.968 18568-18568/com.example.nbcei.androidart E/main: onRestart: 09-05 10:38:51.971 18568-18568/com.example.nbcei.androidart E/main: onStart: 09-05 10:38:51.972 18568-18568/com.example.nbcei.androidart E/main: onResume: 09-05 10:38:52.545 18568-18568/com.example.nbcei.androidart E/main: onStop:2 
阅读全文
0 0
原创粉丝点击