android 之 Activity管理与Intent的六大属性

时间:2021-07-11 16:25:56

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的六大属性:

android 之 Activity管理与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

android 之 Activity管理与Intent的六大属性

<3>Data(数据)

Data属性包括两部分,URI(通用资源标识符)和Type(MIME类型)

MIME类型详解:MIME

常用的Data取值:

android 之 Activity管理与Intent的六大属性

<4>Category(分类)

一个含有Intent的附加信息的字符串,这些信息可以决定哪种组件应该处理这个Intent

常用的Category:

android 之 Activity管理与Intent的六大属性

Category一般被设置在IntentFilter中

对于显式Intent,如果不指定Category,则无论IntentFilter的内容是什么都是匹配的

对于隐式Intent,Android会自动加上CATEGORY_DEFAULT,这样一来,如果Intentfilter中没有这个Category的话,匹配就会失败。