activity的启动模式

1,Activity的lanchMode

     standard:标准模式,每次启动一个新的Activity实例。谁启动Activity就运行在启动它的那个Activity所在的栈中。比如Activity A启动了Activity B,那么B就会在A所在的栈中。所以使用ApplicationContext(非Activity类似的Context)启动standard模式的Activity,会报下面的错误:

      原因是ApplicationContext并没有任务栈,因此启动Activity时, 需要指定FLAG_ACTIVITY_NEW_TASK标记位,实际上已经使用了singleTask模式启动。

    singleTop:Activity如果在任务栈的栈顶,则Activity不会被创建,同时Activity的onNewIntent的方法会被调用。

    singleTask:Activity想要的任务栈中存在,并且栈中有该Activity的实例(Activity可以指定任务栈),那么启动Activity时不会重新创建实例,并且会调用Activity的onNewIntent方法。(备注:该模式下默认具有clearTop的效果,导致所有该Activity上面的Activity出栈。)

    singleInstance:加强版singleTask,具有singleTask模式的所有特性,还加强一点,此模式下Activity只能单独位于一个任务栈中。

2,TaskAffinity作用:

这个参数标识了一个Activity所需要的任务栈的名字。默认情况下,所有Activity所需要的任务栈的名字都是包名。也可以单独指定TaskAffinity属性(不能和包名一样,否则和没指定一样)。

3,Activity的Flags

FLAG_ACTIVITY_NEW_TASK : 该标记位作用是指定了"singleTask"启动模式,

FLAG_ACTIVITY_SINGLE_TOP:该标记位作用是指定了"singleTop"启动模式,

FLAG_ACTIVITY_CLEAR_TOP:当指定的Activity被启动时,同一任务栈位于它之上的Activity都会被清除。

FLAG_ACTIVITY_EXCLUB_FROM_RECENTS:启动的Activity不会出现在历史的Activity列表中,某些情况下用户不希望通过历史列表回到我们的Activity

4,IntentFilter的匹配规则

    1,一个Activity可以有多个Intent-filter,个一个Intent只要匹配一组Intent-filter可以成功启动对应的Activity

    action的匹配规则:

    Intent中包含多个action,其中一个action能够和过滤规则中的任何一个action相同就算匹配成功。如果没有指定action,那么会匹配失败。

    category的匹配规则

    Intent中可以包含多个category,所有的category和过滤规则匹配,则算匹配成功。没有Category也可以匹配成功。默认Intent会加上android.intent.category.DEFAULT这个category,所以intent没有任何category也能匹配成功。(activity】能够接收隐式调用,就必须在intent-filter中指定android.intent.category.DEFAULT这个category)

    data的匹配规则

    data规则和action类似,如果规则中定义了data,那么intent中必须也要定义可以匹配的data(一一对应)

猜你喜欢

转载自my.oschina.net/appleliu/blog/1631257