Android APP间显隐启动及activity启动模式+taskAffinity+FLAG使用

component(显示启动)

设置启动目标包名类名,可通过intent的setClassName,setClass,setComponentName成员方法设置

Action,Category,Data,Type(隐式启动)

action和category以及Data和Type一般都是配合来隐式启动activity,可以和activity 具体包名类名解耦,type是辅助定义data类型的

action匹配规则:
  • 接收方manifest可注册多个action
  • 发送方intent要匹配只能设置接收方其中一个action
  • actoin可是完全自定义字符
category 匹配规则:
  • 接收方manifest可注册多个category
  • 发送方intent可设置多个category,发送方所有category都属于接收方category子集才算匹配,发送方的category可以不写,默认会加上,接收方不能省
  • 有些category必须要加上data,比如android.intent.category.BROWSABLE
  • 必须设置和setAction一起才生效
data/type匹配规则:
  • 接收方manifest设置一个data,发送方intent只能设置一个data,这个data要和收方注册一样则算匹配
  • data 是 URI格式(<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>] )组成,最后面可以带额外的参数(?key1=value1 & key2 = value2)
  • mimeType是描述data数据类型比如 image/jpeg、audio/mpeg4-generic、vidio/等

extra

放置额外的数据,activity之间数据通信一般通过这个putextra方法,但是数据必须是基本类型或则实现了序列化接口的对象

单个APP自己activity启动模式

  • standard 默认,不管任务栈有没有,每次创建一个activity对象,适用于一般普通页面

  • singleTop 任务栈顶的activity和我们启动的activity是同一个类的时候,不重复创建对象,直接复用,并走onNewIntent()生命周期,反之要创建一个新对象,适用于activity自己启动自己的场景

  • singleTask 任务栈内存在activity的类和我们要启动的activity类是同一个试,直接复用这个activity对象不再创建,走onNewIntent()生命周期,并且把这activity之上的activity全部清理出栈,intent设置FLAG_ACTIVITY_CLEAR_TOP可以达到相同作用,适用于应用首页场景

  • singleInstance 整个任务栈只有一个activity对象,多次启动都只会在这单一的任务栈里复用这个单一的activity对象只执行onNewIntent()生命周期不再创建新的,适用于闹钟电话等全app唯一的系统应用场景

上面四种模式是单个app,应用自己控制自己的Activity启动,如果是其他APP要控制另外一个APP的Activity启动模式,需要在java代码设置FLAG,请重点关注FLAG_ACTIVITY_NEW_TASK(原创~)

  • taskAffinity 任务栈名称,一般是应用包名,若要新建任务栈需要另起一个名并配合FLAG_ACTIVITY_NEW_TASK使用,在androidmanifest使用

  • FLAG_ACTIVITY_NEW_TASK 目的是启动activity到一个新的任务(Task)中,这个属性要特别注意用法:
    1.多个APP情况下如果目标是singleTask或者singleInstance 单一设置了也是无效的,设不设置都会新起任务栈,目标activity配置taskAffinity为新的名称,可以新起一个不同于应用包名的任务栈,不配置taskAffinity则启动应用包名的任务栈(设置taskAffiinity为其他包名和不设置taskAffinity区别在于:设置了点击目标桌面图标时候还会有应用包名任务栈启动,这个时候目标APP就有俩个任务栈了)
    2.多个APP情况下如果目标是standard或者singleTop,不设置不会新起一个任务栈,会在当前APP显示另一个APP的界面!设置了 这个flag会新起应用包名的任务栈,配置taskAffinity为其他包名可以新起一个不同于应用包名的任务栈,并且standard或者singleTop这种情况若目标task已存在,则不会创建activity,而是把task带到前台,要想创建目标activity,需要两个以上的FLAG:FLAG_ACTIVITY_NEW_TASK或加FLAG_ACTIVITY_CLEAR_TOP或FLAG_ACTIVITY_MULTIPLE_TASK,参考google注解:
    When using this flag, if a task is already running for the activity you are now starting, then a new activity will not be started; instead, the current task will simply be brought to the front of the screen with the state it was last in. See FLAG_ACTIVITY_MULTIPLE_TASK for a flag to disable this behavior

  • FLAG_ACTIVITY_MULTIPLE_TASK,配合FLAG_ACTIVITY_NEW_TASK,不停启动的话会创建无数个task

  • FLAG_ACTIVITY_CLEAR_TASK,如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。

  • FLAG_ACTIVITY_SINGLE_TOP 如果要启动的 Activity 已经位于任务栈的顶部,那么系统不会重新创建这个 Activity,而是会调用该 Activity 的onNewIntent方法,类似manifest里面设置singletop

  • FLAG_ACTIVITY_CLEAR_TOP果要启动的 Activity 已经在任务栈中存在,使用这个标志会清除该 Activity 之上的所有其他 Activity,然后将这个 Activity 置于栈顶,类似manifest里面设置singleTask

  • FLAG_ACTIVITY_NO_HISTORY当 Activity 被启动时带有这个标志,系统在该 Activity 停止后(例如用户按下返回键),不会将其保留在任务栈中

其他的FLAG需要的网上自己查吧比较简单和统一了,重点理解FLAG_ACTIVITY_NEW_TASK+taskAffinity

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容