在处理Android项目的时候经常会出现多个activity之间的转换以及在activity转换的时候实现某些数据的传递,在启动每一个应用程序的时候系统都会创建一个任务栈个这个程序,然后程序里面的所有activity都会在加到这个任务栈里面来,有的时候我们需要去对这个栈里面的某一个特定的activity进行处理,这个时候就需要去对activity的启动模式进行处理:任务栈一共存在四种启动模式:
一:standard:系统默认的启动模式,不管activity是否重复都会像栈里加入activity,因此在按返回键时每次销毁一个activity,因此按多次销毁任务栈里所有的activity才会退出程序
二:singleTop模式:当一个activity指定为该模式时,在点击调用该activity时,会检测栈顶是否为该activity如果是就调用栈里的activity,否则才会重新创建一个新的activity放入栈里
三:singleTask:当一个activity指定为该模式时,在加载该activity时候会检测栈里是否有该activity,如果有则直接调用栈里的activity,同时销毁掉调用activity上面的所有activity
四:singleInstance:一个activity指定为该模式时,调用该activity时系统不会将activity放入默认的分配的任务栈,而是创建一个新的任务栈放入新的任务栈内。并在默认的任务栈内引用新任务栈里的该activity,当再次调用该activity时候再次引用新建栈内的activity,当按返回键销毁该activity时候就会销毁新任务栈内的该activity,并且销毁默认任务栈内的对该activity的所有引用
四种启动模式各有自己的适用场景,可以从其模式定义入手。
在项目中经常会遇见activity跳转时的数据传递问题,举个例子在启动模式为singleTask的时候从activity A 启动 activity B 再从activity B启动activity C最后从activityC启动activityA,与此同时从activityC使用Intent传递数据到activity A,这个时候应该怎么去获取穿过去的数据呢:
首先先来看看默认启动模式的情况下数据是怎么传递的吧:
这是在默认启动模式下清单文件中的配置
<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=".OtherActivity" /> <activity android:name=".ThreeActivity"/>
这是三个activity的简单代码实现
这是在默认情况下在oncreate方法里面直接getIntent获取数据然后打印出来的数据
然后现在把启动模式修改为singleTask,这个时候可以很明显的看到日志并没有任何数据的打印,然后从在activity A直接点击返回键的情况下程序直接结束了。这是什么原因呢?
这是因为singleTask模式会检测当前的activity是含有该activity,如果有则直接调用栈里的activity,同时销毁掉调用activity上面的所有activity。至于数据为什么会得不到是因为在启动这个activity系统会先去查询这个栈中是否含有activity有就直接调用所以并不是生成一个新的activity。那么问题来了那我硬要实现这个功能应怎么办呢?别急接下来我们就说说解决办法:
activity中有一个onNewIntent()方法,当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent
以上就是在这两种启动模式下的一些小区别,其他的模式有兴趣的可以自己去试试