最近在读一些Android方面的工具书温习一些一些基础知识,发现有些知识讲解的很好,在这里就把书中的和自己从网上查到的一些知识点总结一下,以备自己查阅。
谈到Android任务栈,就必须提到AndroidManifest里的几种启动方式。
standard方式就不用赘述了,是我们Activity默认的启动方式。在这里我需要列一下自己在学习中的感想:当我们在standard模式下的时候,当我们使用applicationcontext去启动standard 模式的Activity时,会报错误,错误如下:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
为什么会报这样的错误呢?因为standard模式的Activity默认会进入当前Activity的任务栈中,因为ApplicationContext并没有任务栈,所以会报如上的错误。解决的方法就是提供FLAG_ACTIVITY_NEW_TASK flag标记位,这个时候启动就会创建一个新的任务栈,这个时候启动的Activity是以singleTask模式启动的。
如果我们的启动Activity的方式是singleTop的话,那么在启动的时候,系统会判断当前栈顶的Activity是不是要启动的Activity,如果是则不用再创建新的Activity而是直接引用这个Activity;如果不是则创建新的Activity。
singleTask模式则是检验整个Activity栈中是否存在当前需要启动的Activity,如果存在,则将这个Activity置于栈顶,并将该Activity上的Activity全部销毁。
singleInstance模式则是指会创建一个新的任务栈,它会拥有一个新的taskid。它创建的Activity会直接加载在前一个task队列中,而不是在新的taskid中。这个慕课网教程说的非常好,推荐给大家:http://www.imooc.com/video/7590,尤其是老师画图讲解的部分,我觉得是说的最清楚的。
同样地,我们的intent flag也有很多值,较为常用的是:
FLAG_ACTIVITY_SINGLE_TOP,它的效果和之前的manifest中的“singleTop”相同。
FLAG_ACTIVITY_CLEAR_TOP,他的方式是与singleTask相同,我却曾经错误地把它当做一个清空任务栈的操作来做的,在这里要牢记singleTask的使用方式。
FLAG_ACTIVITY_NO_HISTORY,它的方式是在跳转到另一个Activity之后,原来的Activity被自动移除了,也就是和我们跳转之后再finish掉前一个Activity是一个效果。
FLAG_ACTIVITY_CLEAR_TASK,如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。
这里可能有一些知识对于大家来说谁老调重弹,但是在这里我尽量使用我自己 所能理解的最简单的语句来记录这些Android的知识点,以备自己查阅。