Android 组件系列 -- Activity 栈、taskAffinity、intent/flag

Android解析ActivityManagerService(二)ActivityTask和Activity栈管理 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够。这一篇我们接着来学习与AMS相关的ActivityTask和Activity栈管理。 阅读详情
  • 本章知识点
  • Activity栈 简介
  • Activity栈 和 taskAffinity 之间的关系
  • intent/flag

Activity栈

  • task 是一个具有栈结构(先进后出)的容器,它是一组 Activities 的集合,一组Activities被Stack(back stack)所管理,栈中 Activity 的顺序就是按照它们被打开的顺序依次存放的。
    • 栈是一种抽象的概念。
    • 正如老罗在他的文章Android应用程序内部启动Activity过程(startActivity)的源代码分析最后所提到的:既不是我们在Linux系统中所理解的进程(Process),也不是线程(Thread),它是用户为了完成某个目标而需要执行的一系列操作的过程的一种抽象。这是一个非常重要的概念,它从用户体验的角度出发,界定了应用程序的边界,极大地方便了开发者利用现成的组件(Activity)来搭建自己的应用程序,就像搭积木一样,而且,它还为应用程序屏蔽了底层的进程,即一个任务中的Activity可以都是运行在同一个进程中,也中可以运行在不同的进程中。
    • 脱离 Activity 来谈栈,是毫无意义的。

场景一 : 从App尚未打开,打开现实 A Activity,从 A 跳转至 B,然后按回退键至退出 App。

  • 如下图所示:
  • 普通启动模式下,所有的Activity都在一个栈内。
  • 正如之前描述的那样,栈的存储结构是先进后出,当所有的Activity都销毁,栈自然也就不存在了。


场景二 : 从App尚未打开,打开现实 A Activity,从 A 跳转至 B(与场景一不同的是 B 的启动模式是 singleInstance),从 B 跳转 C ,然后按回退键至退出 App。
如下图所示:

  • 特殊的启动模式下,并不是所有的Activity都在一个栈内,图中就存在两个栈。
  • Android系统对于栈的行为,也是一个一个退出,就如图中,尽管是 A->B->C的跳转顺序,但是在回退时,是先退出C所在的栈后,再退出B所在的栈:C->A->B。


  • taskAffinity

    • taskAffinity 是 Activity 的一个重要的属性:
    • taskAffinity表示一个 task,这个任务就是当前 activity 所在的 task
    • 在概念上,具有相同的 affinity 的 activity(即设置了相同 taskAffinity 属性的 activity)属于同一个 task
    • 一个 task 的 affinity 决定于这个 task 的 根 activity(root activity)的 taskAffinity
    • 默认情况下,一个应用中的所有activity具有相同的taskAffinity,即应用程序的包名。我们可以通过设置不同的taskAffinity属性给应用中的activity分组,也可以把不同的应用中的activity的taskAffinity设置成相同的值。
    • 该属性只对 singleTask 模式下的 Activity 起作用

      • 在前面介绍启动模式的文章中 Android 组件系列 – Activity 启动模式,限于当时 taskAffinity 和 task 的知识点还没有介绍到,仅仅只介绍了 singleTask 栈内复用的特性。
        • 事实上 singleTask 的真实作用包含了两个
        • 同一栈内复用(也是唯一)
        • 将该 Activity 设置为可以在新 task 中启动,至于是否启动新的 task,还需要看 taskAffinity 属性的值。
        singleTask(通过对singleTask模式的完整描述,来认识taskAffinity):
          • 当启动一个singleTask模式下的Activity时,系统会先判断当前Activity是否有单独设置过taskAffinity,
          • 如果没有设置过,那么会使用默认的taskAffinity(包名);
          • 如果设置过了就会按照单独设置的taskAffinity为准。
          • 但是不管是默认的taskAffinity,还是特殊的taskAffinity,系统都需要去判断拥有该taskAffinity的栈是否已经存在了:
          • 如果存在,那么就会判断该Activity是否在栈内已经实例化,如果存在就清除该Activity上所有Activity,调用该Activity的onNewIntent方法,并显示在栈顶;如果不存在该Activity的实例,就创建一个新的Activity实例入栈。
          • 如果不存在该taskAffinity的栈,那么就会为新创建的该Activity的实例单独新开一个栈。

        intent/flag

        intent/flag其实可以理解为Android系统提供的额外的启动模式,可以组合,可以拆分。与四大启动模式相比,更全面,更自由。
        • FLAG_ACTIVITY_NEW_TASK
          当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。注意,如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主。
        • FLAG_ACTIVITY_CLEAR_TASK
          如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。
        • FLAG_ACTIVITY_CLEAR_TOP
          当Intent对象包含这个标记时,如果在栈中发现存在Activity实例,则清空这个实例之上的Activity,使其处于栈顶。例如:我们的FirstActivity跳转到SecondActivity,SecondActivity跳转到ThirdActivity,而ThirdActivity又跳到SecondActivity,那么ThirdActivity实例将被弹出栈,使SecondActivity处于栈顶,显示到幕前,栈内只剩下FirstActivity和SecondActivity。这个SecondActivity既可以在onNewIntent()中接收到传来的Intent,也可以把自己销毁之后重新启动来接受这个Intent。在使用默认的“standard”启动模式下,如果没有在Intent使用到FLAG_ACTIVITY_SINGLE_TOP标记,那么它将关闭后重建,如果使用了这个FLAG_ACTIVITY_SINGLE_TOP标记,则会使用已存在的实例;对于其他启动模式,无需再使用FLAG_ACTIVITY_SINGLE_TOP,它都将使用已存在的实例,Intent会被传递到这个实例的onNewIntent()中。
        • FLAG_ACTIVITY_SINGLE_TOP
          当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。
        • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
          如果一个Intent中包含此属性,则它转向的那个Activity以及在那个Activity其上的所有Activity都会在task重置时被清除出task(前提:FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)。当我们将一个后台的task重新回到前台时,系统会在特定情况下为这个动作附带一个FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,意味着必要时重置task,这时FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET就会生效。经过测试发现,对于一个处于后台的应用,如果在主选单点击应用,这个动作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,长按Home键,然后点击最近记录,这个动作不含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,所以前者会清除,后者不会。
        • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
          如果一个Intent中包含此属性,则它转向的那个Activity以及在那个Activity其上的所有Activity都会在task重置时被清除出task(前提:FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)。当我们将一个后台的task重新回到前台时,系统会在特定情况下为这个动作附带一个FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,意味着必要时重置task,这时FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET就会生效。经过测试发现,对于一个处于后台的应用,如果在主选单点击应用,这个动作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,长按Home键,然后点击最近记录,这个动作不含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,所以前者会清除,后者不会。(如下图,从网上抄来的)


        • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
          这个标记在以下情况下会生效:1.启动Activity时创建新的task来放置Activity实例;2.已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例。我们结合上面的CLEAR_WHEN_TASK_RESET可以加深理解。
        • FLAG_ACTIVITY_NO_HISTORY
          定义:如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。
          • 事实上以上的定义,是有歧义的,我在很多文章中都看到过这个说法。关于 不再历史stack中保留 和 用户一离开它,这个Activity就关闭了 这两句话:
            场景: A -> B(FLAG_ACTIVITY_NO_HISTORY)-> C
            事实上,在C显示到用户眼前的时候,栈里面Activity的数量(默认都是在同一个栈内)依然是3,并不是所谓的 A->C,而是 A->B->C;而当用户离开C时,此时栈会在回收C的同时,将B也回收,用户会直接看到A,栈内Activity的数量会直接变为1。


        到此,Intent Flag 相关知识就告一段落了,不出意外的话,以后会不间断的补充 Flag,对于不常用的 Flag,我觉得没有必要清楚记得,只要有个印像,就算没印像,查一下就好。
        彩蛋
        • Intent.FLAG_ACTIVITY_NEW_TASK 这个属性除了可以启动新的 Task,还有一个隐晦的特性:
          应用的启动 Task 我记录为 Task1,其中有 Activity A->B->C;
          由TaskA所启动的新栈为 Task2,Task2中有 Activity H->I->J,此时处于栈顶的是Task2;
        • 在ActivityJ中:
          startActivity(Intent(this,ActivityA::class.java).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
          那么此时 Task1 被调度到前台,Task2转到后台,并且此时的 Task1 中的 Activity : A->B->C->A。
          而如果此时你从 Task1 中的 ActivityA 中调用如下代码:
          startActivity(Intent(this, ActivityH::class.java).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
          Task 的转换不会有什么问题:自然是 Task1 被调度到后台,Task2 再次转到前台;
          但是此时你会发现此时的Task2中,Activity 依然是 H->I->J,并没有因为 startActivity 而变成 H->I->J->H;
          而如果我改一下之前的跳转逻辑,我设置 Task2 的跳转依然会将 Task1 转到前台:
          startActivity(Intent(this, ActivityD::class.java).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
          其中 ActivityD 的 affinity 与Task1 一致,并且D 会跳转到 I:
          startActivity(Intent(this, ActivityI::class.java).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
          那么此时 Task2 再次转到前台,而且栈中 Activity 的顺序则变成了:H->I->J->I。
        • 结论:除了 APP 默认的 affinity 的 Task ,其他 衍生出来的 Task 当 其 Root Act 被其他 Task 在次调用,衍生 Task 中 Activity 数量,位置不会产生变化,简而言之此时的startAct 的操作,就只是为了将 Root Act 的Task 调度到前台,但是却不改变 Task,当然衍生 Task 中其他 Act 另当别论。



        到此,本文结束:其实本文的重点在于对 task 和 taskAffinity 的理解。Intent Flag 列出了常用的一些Flag。而最后的彩蛋,其实从某种意义上来说,是想提醒自己,Android里面依然很有多细节,不管是开发还是学习都需要谨慎对待。

        参考文章

        Android中,Intent.setFlags();几个常用的属性

你真的了解taskAffinity属性么? 在2019年,有安全研究员向Google官方提交了一个利用taskAffinity的漏洞,后面被命名为StandHogg。最近在2020年5月份又公布了StandHogg 2.0漏洞。StandHogg 2.0 隐藏的更深,一般很难发现,甚至都不用设置taskAffinity就可以实现。目前官方已经发布了Android 10.0系统补丁包,有条件的可以对系统进行升级。有兴趣的同学可以看下这篇文章:https://www.xda-developers.com/strandhogg-2-0-android-vu 阅读详情

相关推荐

Android中Activity四种启动模式和taskAffinity属性详解-Rong

# Android中Activity四种启动模式和taskAffinity属性详解 #

taskAffinty使用详解

taskAffinity详解

qq_38056514的博客 4520

Crush 终端 LLM 工具安装与使用指南:把 AI 编程助手装进你的命令行

喜欢命令行的开发者需要离线/轻量级 AI 助手的场景希望自定义模型与工具链的高级用户通过LSP + MCP + 多模型支持,Crush 不仅能写代码,还能理解项目、调用工具、连接服务,真正成为你的“终端编程搭档”。

weixin_44058951的博客 1616

Android TaskAffinity解析

一、什么是TaskAffinity? Taffinity是指Activity的归属,Activity与Task的吸附关系,也就是该Activity属于哪个Task。一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命。每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Appli

分享Android开发知识 6252

AI Agent ReAct架构设计模型剖析

ReAct通过"思考-行动-观察"循环运作:智能体先进行自然语言推理,再调用外部工具执行行动,观察结果后继续推理直至解决问题。这种架构提高了透明度和准确性,减少幻觉风险,使LLM能主动分解任务并利用外部数据源。实现关键在于精心设计的提示模板,引导LLM按结构化格式响应,而非依赖模型固有能力。

weixin_43939320的博客 1250

采用MPU6050的手势遥控器

随着社会的发展与进步,电子产品日益更新,个人家庭迎来了越来越多的智能家电。然而,现在的智能电子设备产品的遥控器多数都是按键形的。操作繁琐不直观,学习成本大。并且对于有老人小孩的家庭,给他们的操作带来了巨大的障碍。手势遥控器是指利用简单的手势来指挥电子设备,获得便捷的操作体验。让家庭成员都可以享受科技发展带来的福利。MPU6050是一个运动传感器,内置陀螺仪,再由电子设备利用判断结果做出相应的响应即...

Sakura的博客小站 6602

Android中Activity四种启动模式和taskAffinity属性详解

启动主Activity A,接着A开启B,B开启C,这时栈中有三个Activity,并且这三个Activity默认在同一个任务(task)中,当用户按返回时,弹出C,栈中只剩A和B,再按返回键,弹出B,栈中只剩A,再继续按返回键,弹出A,任务被移除。

w1142203475的博客 3289

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

android深入解析Activity的launchMode启动模式,Intent Flag,taskAffinity

最近看到一篇文章讲launchMode,想到以前的一次面试,就问了这一个问题,最基本的大家都知道,但是详细的我就迷糊了,最终失败了,所以在此总结一下,希望能够帮助一下大家LaunchMode  launchMode分为四种:    standard  standard启动模式为最基本的启动模式,默认为该种启动模式,特点就是每当发送一个intent请求打开该activity时,都会创建一个新的ac

Shawn_Dut的专栏 1万+

AD7920实战:从咪头到ADC的音频信号采集电路设计全解析(附电路图)

本文详细解析了基于AD7920 ADC芯片的音频信号采集电路设计全流程。从驻极体咪头的驱动、AD8542运放的两级增益与偏置设计,到关键的抗混叠滤波器配置,以及ADC接口的驱动缓冲与PCB布局要点,提供了完整的实战指南与电路图,帮助开发者实现高质量音频信号采集。

red88的博客 802

AI 辅助编程全景:演进、提效场景与未来趋势

本文系统梳理了AI辅助编程的发展历程与应用场景。演进路径分为三代:从代码补全工具(2023)、对话式助手(2024)到自主编程代理(2025)。在软件全生命周期中,AI可显著提升各环节效率:需求分析阶段节省30-60%文档编写时间;设计阶段缩短40-60%技术调研周期;编码阶段通过智能补全提升55%任务速度;测试阶段减少30-60%测试编写时间。数据显示,2025年84%开发者使用AI工具,41%代码由AI生成,平均每周节省3.6小时。AI正推动开发者角色从编写者转变为审核者,但复杂业务逻辑和架构设计仍需人

甘蓝的专栏 472

FLAG_ACTIVITY_NEW_TASK 和 taskAffinity

这俩货在一起可以控制Intent时是否新启动一个任务栈,下面通过实例看一下,这俩货怎么配合才能真正新启动一个任务栈额。一、只设置taskAffinity:MainActivity.java:package com.example.administrator.myapplication; import android.content.Intent; import android.support.v

张亚运的专栏 2463

学Simulink--基于多物理场耦合与系统集成的储能系统场景实例:压缩空气储能(CAES)系统的热力学建模与效率分析

本文提供了一个基于Simulink的压缩空气储能(CAES)系统热力学建模教程。通过多物理场耦合方法,详细演示了从系统架构设计到仿真测试的全过程,包括多级压缩机/膨胀机系统搭建、显热蓄热系统设计以及效率分析。文章重点强调了热管理对提升CAES效率的关键作用,并给出了68%电-电效率的优化案例。最后提出了变工况建模、不同蓄热介质对比等高级优化方向,为开发零碳大容量储能系统提供了实用工具和方法。

amy_mhd的博客 131

Activity launchMode,taskAffinity,Intent.Flag

Activity launchMode,taskAffinity,Intent.Flag 详解参考: 1. www.programering.com 2. http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en 3. developer.android.com1. Task 和 返回栈Androi

fengniuma的专栏 610

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Activity栈管理(三):Intent的Flag与taskAffinity

作者:anly_jun 链接:https://www.jianshu.com/p/c97688eb5056 引用上文生命周期和launchMode介绍, Activity的生命周期实际上比我们想象的复杂得多. 本文主要通过实例, 来探索下Activity的启动Intent Flag以及taskAffinity对生命周期和Task/Back Stack的影响. 算是对生命周期和launchMode的一个补充, 以便我们在开发过程中灵活组合运用. 照例, 我们先从一些官方解释开始: 1, 相关概念 对生命.

大模型学习路线 874

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android:taskAffinity属性的用法

Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系。我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命周期,这些Activity是从一而终的好榜样。 那么为什么我们创建的Activity会进入这个Task中?它们会转到其它的Task中吗?如果转到其它的Task中,它们会到什么样的Ta...

院主的博客 8136

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Activity LaunchMode,TaskAffinity,intent过滤规则及Flag资料整理

Activity LaunchMode,TaskAffinity,intent过滤规则及Flag资料整理

Jiaxu的专栏 1979

Android Intent.FLAG_ACTIVITY_NEW_TASK的说明

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33788244的博客 7359

Android TaskAffinity详解:多任务栈管理与Activity启动模式实战

在Android应用开发中,任务栈(Task)是管理用户操作流程的核心机制,它决定了Activity的组织方式和返回逻辑。其工作原理基于任务亲和性(Affinity),系统通过匹配Affinity值将Activity分配到相应的任务栈中,从而实现界面流程的隔离与整合。这一机制的技术价值在于支持模块化应用设计、跨应用界面集成以及更清晰的用户导航体验。在实际应用场景中,开发者常需为特定功能模块创建独立任务栈,或实现Activity在不同任务间的动态迁移。本文聚焦于Android的taskAffinity属性,结

weixin_34396103的博客 343

intent flag介绍

intent几种常见的flags: 1.FLAG_ACTIVITY_NEW_TASK A应用a ->b应用b 首先A应用a默认taskAffinity 是A的包的名称B同理 当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的tas

qq_21992025的专栏 1303

【Android】关于FLAG_ACTIVITY_NEW_TASK 和 taskAffinity

FLAG_ACTIVITY_NEW_TASK有用吗在Android开发中,我们经常会需要通过Context对象来启动一个Activity。如果Context对象不是Activity,则需要给Intent对象添加flag: FLAG_ACTIVITY_NEW_TASK。 这个是大家都知道的,原因大家也可以直接说出来,Activity对象包含任务栈信息,可以直接在任务栈中启动新的Activity,其他C

Lankton 1596

Android 中的四种启动模式 和 Intent中Flag的使用

https://blog.youkuaiyun.com/u011240877/article/details/71082720 https://blog.youkuaiyun.com/u010389391/article/details/78558475

liu_12345_liu的博客 1218

Android任务管理核心:TaskAffinity机制深度解析与实战应用

在Android应用开发中,任务(Task)管理是构建复杂导航与多窗口体验的基石。任务作为Activity的容器,其核心机制由Affinity(亲和性)决定,它定义了Activity的归属逻辑。理解Affinity与Launch Mode、Intent Flags的协同原理,是解决跨进程启动、深度链接导航、独立窗口等复杂场景的关键技术。通过合理配置taskAffinity,开发者能精准控制Activity的任务栈归属,实现如独立登录流程、WebView独立浏览、多进程任务隔离等高级功能,从而优化用户体验与系

weixin_33693070的博客 461

Android 之Activity启动模式(二)之 Intent的Flag属性

前面介绍了通过launchMode设置Activity的启动模式。本章接着介绍Activity的启动模式相关内容,讲解的内容是Intent与启动模式相关的Flag,以及android:taskAffinity的属性。 目录 1. Intent与启动模式相关的Flag简介 2. 1. FLAG_ACTIVITY_NEW_TASK标签测试 3. 2. FLAG_ACTIVITY_C

ysh06201418的专栏 1036

Activity的任务栈Task以及启动模式与Intent的Flag详解(经典博文,值得收藏!),五步搞定Android开发环境部署

启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;并不是一定会在新的任务栈中打开.(具体要根据taskAffinity(班级名称)看系统(学校)中是否已经有这个任务栈(班级)了).如果需要在新的任务栈中启动,就需要为activity设置独立的taskAffinity.

2401_84153038的博客 1132
上一篇: Android 组件系列 -- Activity 启动模式
下一篇: Ubuntu 访问共享文件夹
jia-huan
博客等级 码龄12年 134粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值