Task的概念:
任务(Task):为了完成一个目标而产生的多个Activity的集合
Back Stack 回退(返回)栈:一个先进后出的数据结构,用来存储完成目标所需要的Activity的集合
Activity的启动模式:
开发时让我们根据不同的需求选择相应的模式:
如果Activity在主包名下,则注册Activity时前面的.可以省略不写,但如果
Activity在当前主包名的子包下,则必须写成如下形式:.子包名.Activity,
此时的.不能省略
<1>android:launchMode="standard":标准的启动模式,也是默认的启动模式,
特点:
每次使用startActivity(intent)启动Activity时都会实例化一个新的Activity
对象并放入回退栈中
<2> android:launchMode="singleTop":在启动新的Activity时会首先判断当前回退栈的栈顶存放
的Activity和将要启动的Activity是否相同,如果相同,则不会重新实例化新的Activity,
并入栈,而是重用栈顶的Activity,此时只会调用目标Activity的onNewIntent()方法。
<3>android:launchMode="singleTask":在启动新的Activiy是会首先判断当前回退栈中是否有和
将要启动的Activity相同的Activity,
如果有并且在栈顶,则这个启动模式和singleTop相同,
如果有并且不在栈顶,则首先会将和目标Activity相同的Activity上面的Activity依次出栈,将和目标
Activity相同的Activity作为栈顶的Activity.此时也会自动调用onNewIntent()方法.
<4>
android:launchMode="singleInstance": 在启动新的DetailActivity时,
会将启动的DetailActivity放入一个独立的新栈中并将这个DetailActivity的引用地址赋值到栈顶的
Activity变量中,如果此时启动其他
OtherActivity,则根据其它OtherActivity的启动模式决定是否将其他的OtherActivity重新入栈,
如果其他OtherActivity入栈后再次启动新的DetailActivity,则会将之前的DetailActivity的引用
Intent的六大属性:
<1>ComponentName(组件名)
组件名用来处理Intent的匹配问题,它可以被设置,也可以不被设置。
设置了组件名的Intent叫做显示Intent,这种Intent在匹配时将直接使用组件名里的参数。
Intent Intent = new Intent (this,NewActivity.class);
startActivity(intent);
不设置组件名的Intent叫做隐式Intent,这种Intent在匹配时将会从Action,Data(URI和Type)或Category中寻找信息
Intent intent = new Intent();
ComponentName cn = new ComponentName(this,NewActivity.class);
intent.setComponent(cn);
startActivity(intent);
<2>一些系统内置的Action:
<3>Data(数据)
Data属性包括两部分,URI(通用资源标识符)和Type(MIME类型)
MIME类型详解:MIME
常用的Data取值:
<4>Category(分类)
一个含有Intent的附加信息的字符串,这些信息可以决定哪种组件应该处理这个Intent
常用的Category:
Category一般被设置在IntentFilter中
对于显式Intent,如果不指定Category,则无论IntentFilter的内容是什么都是匹配的
对于隐式Intent,Android会自动加上CATEGORY_DEFAULT,这样一来,如果Intentfilter中没有这个Category的话,匹配就会失败。