activity启动模式你所不知道的异常情况

本文探讨了在Android中activity启动模式可能导致的异常情况,包括Standard、SingleTop、SingleTask和singleInstance模式,以及FLAG_ACTIVITY_NEW_TASK的影响。重点讨论了task和taskAffinity的概念,分析了在不同场景下如何影响activity的启动和管理。在复杂场景中,例如同一activity在不同task间切换,可能会遇到无法打开或创建多个activity实例的问题,这些问题与intent标志和启动模式的组合有关。
摘要由CSDN通过智能技术生成

前言

虽然了解activity的四种启动模式,但是在一些复杂场景下,各种启动模式会出现的现象,以及现象的原因并不清楚,再加上个taskAffinity launchMode clearTaskOnLaunch 这些参数会使得更加懵逼。所以根据在实际应用中遇到的问题总结一下。

主要内容

要讲启动模式需要从Task ,taskAffinity 以及launchMode,还有标签四个方面入手,看这四个之前的关联以及影响。 在这里插入图片描述

Task

task跟activity的启动息息相关,因为activity启动后都是放在task里面进行管理的,task的数据结构是stack的,先进后出,新创建的activity放在task的顶部,如下图打开ActivityA->activityB->activityC: 在这里插入图片描述task的特点:

  1. activity的集合
  2. 以栈的形式对activity进行管理(back stack)
  3. task里面至少包含一个activity
  4. 新创建的activity放在栈顶。
  5. 每一个task都有称为Affinity的name。

TaskAffinity

taskAffinity是activity可以在manifest文件里面设置的属性.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.coroutinescopedemo">

    <application android:allowBackup="true">
        <activity
            android:name=".MainActivity"
            android:taskAffinity="hanking.edu">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
复制代码

用来确定启动的activity属于哪个task,或者确定task的名称。具体的功能如下:

  1. 用来决定持有activity的task是哪个。

  2. 默认情况下一个app里面的activity都有相同的affinity值(package name)

  3. task的affinity值由触发创建task的activity的affinity值决定。(也被称为root activity)

taskAffinity用来确定activity所在栈的名字,是不是任何时候都会生效?看下默认情况下的两个activity设置不同的affinity会发生什么情况。

1、给activity设置task affinity 如下创建了activityA和activityB,其中给activityB设置了task Affinity值为com.something.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myApp">

    <application
        android:allowBackup=&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值