细谈Activity四种启动模式

Activity的四种启动模式 Activity的启动模式可在项目的配置文件内进行设置 standard:标准模式下每次启动的Activity都会新建,切放到Task任务栈的栈顶,通过点击返回关闭应用的话,就需要返回Activity的新建次数 singleTop:相较于standard模式,singleTop模式下,当新建Activity时,首先会确定该Activity是否在该Task的顶部。如果不在的话才会新建 singleTask: 相较于singleTop模式,singleTask模式下,新建Activity时首先会判断其是否 阅读详情

嗨大家好,又和大家见面了,上一次我们一起搞清楚了Handler的源码机制(现在回想起来是不是感觉也就那么回事,当时看的头皮发麻-。+!!),今天我们谈一谈我们在Android开发中必不可缺少的一个组件——Activity:

    Activity作为四大组件之一,也可以说是四大组件中最重要的一个组件,它负责App的视图,还负责用户交互,而且有时候还经常其他组件绑定使用,可以说非常的重要。

    虽然说我们天天都在使用Activity,但是你真的对Activity的生命机制烂熟于心,完全了解了吗?的确,Activity的生命周期方法只有七个(自己数-。+),但是其实那只是最平常的情况,或者说是默认的情况。也就是说在其他情况下,Activity的生命周期可能不会是按照我们以前所知道的流程,这就要说到我们今天的重点了——Activity的启动模式:我们的Activity会根据自身不同的启动模式,自身的生命周期方法会进行不同的调用。

一、在将启动模式之前必须了解的一些知识:
    在正式的介绍Activity的启动模式之前,我们首先要了解一些旁边的知识,这些知识如果说模糊不清,那么在讨论启动模式的时候会一头雾水(笔者亲身感悟)。

1.一个应用程序通常会有多个Activity,这些Activity都有一个对应的action(如MainActivity的action),我们可以通过action来启动对应Activity(隐式启动)。

<action android:name="android.intent.action.MAIN" />
2.一个应用程序可以说由一系列组件组成,这些组件以进程为载体,相互协作实现App功能。

3.任务栈(Task Stack)或者叫退回栈(Back Stack)介绍:

3.1.任务栈用来存放用户开启的Activity。

3.2.在应用程序创建之初,系统会默认分配给其一个任务栈(默认一个),并存储根Activity。

3.3.同一个Task Stack,只要不在栈顶,就是onStop状态:

3.4.任务栈的id自增长型,是Integer类型。

3.5.新创建Activity会被压入栈顶。点击back会将栈顶Activity弹出,并产生新的栈顶元素作为显示界面(onResume状态)。

3.6.当Task最后一个Activity被销毁时,对应的应用程序被关闭,清除Task栈,但是还会保留应用程序进程(狂点Back退出到Home界面后点击Menu会发现还有这个App的框框。个人理解应该是这个意思),再次点击进入应用会创建新的Task栈。

4.Activity的affinity:

4.1.affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中。

4.2.Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定。

4.3.在默认情况下(我们什么都不设置),所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性。

<application
        android:taskAffinity="gf.zy"
4.4.Application默认的affinity属性为Manifest的包名。


暂时就是这么多了,如果还有不妥的地方我会补充的。接下来我们来正式看Activity的启动模式:

二、Activity启动模式:
1.默认启动模式standard:
    该模式可以被设定,不在manifest设定时候,Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:

上面这张图讲的已经很清楚了,我想应该不用做什么实验来论证了吧,这个是最简单的一个,我们过。

2.栈顶复用模式singleTop:
    在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。

这次我来用代码举例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="zy.pers.activitytext">
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:taskAffinity="gf.zy"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".TwoActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="ONETEXT_TWOACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity android:name=".ThreeActivity">
            <intent-filter>
                <action android:name="ONETEXT_THREEACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
这是我的第一个应用OneText的Mainfest结构,里面创建了三个Activity,我们把第二个Activity的模式设置为singleTop。

每个Activity界面都只有一个显示当前界面名称的TextView和一个用来组跳转的Button,所以应用OneText的功能就是从活动1跳转到活动2,活动2继续跳转活动2,代码就不给大家展示了,都能写出来。

我们发现在我们跳转到TwoActivity之后,点击跳转新的TwoActivity时候,他没有响应。

为了作对比,我们再把TwoActivity设置为standard,看一看效果:

我们发现创建了很多的TwoActivity。

同时我们打印上task的Id(我没有把所有周期方法都打印log):

发现他们全部都是来自一个Task。这个可以过。

应用场景:

开启渠道多,适合多应用开启调用的Activity:通过这种设置可以避免已经创建过的Activity被重复创建(多数通过动态设置使用,关于动态设置下面会详细介绍)

3.栈内复用模式singleTask:
    与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,则:

将task内的对应Activity实例之上的所有Activity弹出栈。
将对应Activity置于栈顶,获得焦点。


同样我们也用代码来实现一下这个过程:

还是刚才的那一坨代码,只是我们修改一下Activity1的模式为singleTask,然后让Activity2跳转到Activity3,让Activity3跳转到Activity1:

在跳回MainActivity之后点击back键发现直接退出引用了,这说明此时的MainActivity为task内的最后一个Activity。所以这个模式过。

应用场景:

程序主界面,我们肯定不希望主界面被多创建,而且在主界面退出的时候退出整个App是最好的设想。

耗费系统资源的Activity:对于那些及其耗费系统资源的Activity,我们可以考虑将其设为singleTask模式,减少资源耗费(在创建阶段耗费资源的情况,个人理解-。+)。

4.全局唯一模式singleInstance:
    这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。       如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)

我们为了看的更明确,这次不按照上图的步骤设计程序了(没错,这几张图都不是我画的-。+!)。

我们先指定一下这次的程序:还是这三个Activity,这次Activity3设置为singleInstance,1和2默认(standard)。

然后我们看一下这个效果:

说一下我们做了什么操作:

首先由1创建2,2创建3,然后又由3创建2,2创建3,3创建2,然后一直back,图如下:

还请各位别嫌弃我-。+,图虽然不好看,但是很生动形象。。。。具体说一下:这张图对应着我们上面的程序流程,黄色的代表Background的Task,蓝色的代表Foreground的Task。

我们发现back的时候会先把Foreground的Task中的Activity弹出,直到Task销毁,然后才将Background的Task唤到前台,所以最后将Activity3销毁之后,会直接退出应用。

但是有没有想过这样会出现一个问题,什么问题我们直接看图就好:

我简单说一下这个案例:1,2,3三个Activity,2是singleInstance模式,然后1->2,2->3,之后狂点back,在回到Home界面后点击菜单键,发现首先启动的是2Activity。

简单解释一下:1和3是一个task,2是单独的一个task,在我们2->3后,前台的task又从2的回到了1和3的。所以最后退出的task是2的线程,而如果不是重新启动App。上一次最后关闭的Task是2的,所以。。

所以说singleInstance设置的Activity最好不要设置成中间界面。

以上表示我们关于四种模式的最基本理解,其实有了前面的知识了解之后,我们发现这些其实也不是很难对吧。。。真正比较绕的在后面-。+,注意前方高能:

三、动态设置启动模式
    在上述所有情况,都是我们在Manifest中设置的(通过launchMode属性设置),这个被称为静态设置(我们写程序写多了会发现有静态就有动态,而且静态多数在xml设置,动态在java代码设置-。+),接下来我们来看一下如何动态的设置Activity启动方式。

注):如果同时有动态和静态设置,那么动态的优先级更高。

1.关于动态设置与静态设置的理解:
    关于这个理解我是看过一篇文章,比较认同里面的思想,所以在这里也总结一下:

    静态设置,可以理解为通知别人:就是当我被创建的时候,我告诉你我是通过这种模式启动的。

    动态设置,可以理解为别人的要求:别人给我设一个Flag,我就以这种Flag的方式启动。

    可能这个没什么用哈,但是仔细想一下这种对程序的思想理解应该是正确的。

2.几种常见的Flag:
    我们说的动态设置,其实是通过Intent。对与Intent这个类大家应该不陌生吧,我们刚才在启动Activity的时候就用到这个类了。

如果我们要设置要启动的Activity的启动模式的话,只需要这样:

intent.setFlags(、、、、、);
然后在里面添加对应的Flag就好,那么接下来我们介绍几个常见的Flag(他的Flag太多了,头皮发麻。):

2.1._NEW_TASK

他对应的Flag如下:

Intent.FLAG_ACTIVITY_NEW_TASK
这个Flag跟我们的singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配:如果已经存在与其affinity相同的task,则将目标Activity压入此Task。    反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。

其实简单来说,就是先看看需不需要创建一个新的Task,根据就是有没有相同的affinity。然后把Activity放进去。

但是此情况和singleInstance有不同,有两点注意的地方:

新的Task没有说只能存放一个目标Activity。只是说决定是否新建一个Task。而singleInstance模式下新的Task只能放置一个目标Activity。
在同一应用下,如果Activity都是默认的affinity,那么此Flag无效。而singleInstance默认情况也会创建新的Task。
这个东西理解起来可能有一些抽象,我们通过一个实例来证明他:

在之前的一些例子中,我们都是在同一应用之间进行跳转,而现在我们进行不同App的Activity相互跳转(其实就是创造一个不同taskAffinity的情况。。。忘了的话见一、4)。

首先,我们需要创建一个新的App——TwoApp,这个App目前只需要一个MainActivity就够了,我们在MainActivity放置一个button,让他跳转到OneApp的TwoActivity。

public void onClick(View v) {
    Intent intent = new Intent("ONETEXT_TWOACTIVITY");
    
    startActivity(intent);
}
这是跳转的代码。

现在我们先概述一下我们的流程:我们先打开TwoApp,然后在TwoApp的MainActivity界面跳转到OneApp的TwoActivity。

对于OneApp的设定,我们已经将三个Activity都设置成了standard模式。还是1->2,2->3,3->2。

代码就不上了,这么简单,大家自己也能写出来。效果如下:

为了看的清清楚楚,最开始清空了所有的进程。

现在我们点开TwoApp,

现在只有TwoApp一个进程,

现在我们点开了 OneApp的TwoActivity,但是我们发现他还是只有一个进程,

现在我们在TwoApp的MainActivity跳转到OneApp的TwoActivity,添加_NEW_TASK的Flag。

public void onClick(View v) {
    Intent intent = new Intent("ONETEXT_TWOACTIVITY");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}
我们再看一下效果,还是跟刚才一样先清空所有的进程,这次效果直接连起来看了:

与上面不同的地方在于,我们新的界面创建在了新的进程中——其实就是OneApp被唤醒了,我们来分析一下为什么会这样:

首先我们会想一下我们上面所学过的一个东西,affinity:我们说这个东西在默认情况下就是App的包名packageName,而OneApp中的TwoActivity默认的affinity就是OneApp的包名。这里能够理解吧。

然后我们说_NEW_TASK情况下,会先查找是否有对应的affinity的task,如果有就不在创建,直接将其放入,反之新建task,所以新建的task就是我们的OneApp的task,我们可以再做一个测试,我们先唤醒OneApp,然后再让TwoApp跳转到OneApp的TwoActivity(有点绕啊。。。),我们看是什么情况:

首先启动OneApp,并跳转到ThreeActivity。

然后启动TwoApp,并跳转到OneApp的TwoActivity。

然后一直点击Back,

我们发现在Two中唤醒One的TwoActivity,同样是被放入了OneApp的默认Task中。

关于_NEW_TASK我们就说这么多吧。

2.2._SINGLE_TOP

该模式比较简单,对应Flag如下:

Intent.FLAG_ACTIVITY_SINGLE_TOP
次Flag与静态设置中的singleTop效果相同,所以请见二、2.

2.3._CLEAR_TOP

这个模式对应的Flag如下:

Intent.FLAG_ACTIVITY_CLEAR_TOP
当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,

如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:

如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
没有设置。。。。。。。,则将栈内的对应Activity销毁重新创建。
关于这个Flag,我们发现他和singleTask很像,准确的说,是在_CLEAR_TOP和_SINGLE_TOP同时设置的情况下,就是singleTask模式。

而唯一不同的一点就在于:他会销毁已存在的目标实例,再重新创建。这个我们通过打印一下生命周期就好。

这次我们只用OneApp就好了,还是1->2,2->3,3->2,这次我们将2的Flag设置为_CLEAR_TOP,看一下TwoActivity的生命周期。

我们的流程如下:1->2       2->3    3->2     2->3    3->2    back    back   然后就退出了,这说明在Task内2上面的3的确被弹出栈了。

然后我们再看一下2的日志:

我想在日志图片上面标注的很清楚了,我只截取了一部分日志,我们质疑3->2时候先销毁,后创建。

好,现在我们同时加上_SINGLE_TOP的Flag。

效果相同,我们只看log:

很明显,在3->2的时候,TwoActivity调用了onRestart方法,也就是栈顶复用了。

这个Flag过。

 

 

Android mainActivity 立即下载

相关推荐

工业缺陷检测深度学习方法综述

异常:点异常、 上下文异常和集群异常。点异常:又称为离群值 (outliers)[9], 描述数值上偏离正 常样本的独立数据。与异常相近的概念还包括新颖点(novelty)和分布外数据。上下文异常:同样描述数据点,其数值属于正常范围,但不符合局部上下文规律。集群异常:描述一系列相关数据的集合,集合中的每一个实例的数值在单独考察时都处于正常值域,但集 合整体的相关性特征不服从正常模式。一般的图像异常检测往往仅需区分正常与异常样本,而工业缺陷检测更关注于检测 图像中的异常像素.

2301_80355452的博客 1842

android找main程序,找MainActivity

什么是MainActivity,就是一个Android的APP 如果它有Activity的话,那么最开始启动的那个Activity就是MainActivity。每一个组件,包括Activity都必须要在AndroidManifest.xml文件中申明。如果是MainActivity的话,那么就会有下面这两个特征:我们随便找了两个APP的AndroidManifest.xml文件看一看 在Main...

weixin_34597791的博客 5281

详解GPU显存和batch size的关系

GPU显存、规格指标;神经网络训练,显存占用

orangerfun的博客 6211

Activity的启动方法

在 Android 中,界面的跳转通常是通过启动不同的 Activity 来实现的,下面介绍一下 Activity 的启动方法。 显式调用 显式调用,字面意思即”明显的调用“,我们可以在调用方法中明确的知道我们即将启动的 Activity,显示调用的具体方法如下: val intent = Intent(this, SecondActivity::class.java) // SecondActivity::class.java 相当于Java中的 SecondActivity.class startAc.

陈宇一的博客 2155

本地部署llama3Chinese

这通常意味着你的构建环境可能不完整或者没有正确配置。通常是由 Visual Studio 的 C++ 工具提供的。(大模型对错误的解析)错误信息表明在尝试构建一个项目时,在 Windows 上,

m0_49343639的博客 1432

别再硬编码了!WinCC子画面动态加载的5种C脚本写法对比

本文深入解析WinCC子画面动态加载的5种C脚本实现方案,包括基础加载、路径动态解析、多语言切换、窗口自适应布局和混合架构交互。通过代码示例和场景分析,帮助开发者避免硬编码问题,提升工业自动化系统的交互效率和可维护性。特别推荐路径动态解析方案,有效解决项目路径管理的痛点。

weixin_29008691的博客 475

记录Android自学(1)- MainActivity

如何创建与设置MainActivity

青寻№的博客 3909

避坑指南:合宙Air780EG阿里云一型一密连接时,为什么你的HmacMD5加密总失败?

本文针对合宙Air780EG模组连接阿里云物联网平台时,HmacMD5签名失败的常见问题提供深度解决方案。详细剖析了签名拼接格式、密钥使用、随机数处理及编码大小写等关键陷阱,并结合STM32嵌入式开发环境,给出了串口调试、分步验证及AT指令链路的实用排错技巧,帮助开发者顺利完成一型一密动态注册。

kiwi8的博客 440

Android入门教程之Activity(生命周期,启动...)

Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

Android23333的博客 9万+

Verilog单周期CPU设计(超详细)

实验 单周期CPU一、设计目的与目标实验内容实验要求二、课程设计器材硬件平台软件平台三、 CPU逻辑设计总体方案指令模块MIPS指令格式指令处理流程数据通路总体结构图设计流程逻辑图四、模块详细设计PCAdd4PCINSTMEMDATAMEMSHIFTER32_L2SHIFTER_COMBINATIONMUX4X32MUX2X5EXT16T32MUX2X32CONUNITREGFILEALUSing...

Ace Cheney的博客 9万+

PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】

最近,Proxmox VE 推出了基于 Debian 13 的 9.0 版本。正巧我手头有一台闲置的老电脑,与其闲置,不如装上 PVE,让它化身 All in One,继续发挥它的余热。G4560 算是一颗 NAS 神 U,十几元的售价就能有双核四线程,比起什么 J1900 不知道强到哪里去了,尽管定位上是奔腾处理器,但性能甚至能和同代的酷睿 i3-7100 掰掰手腕,并且它还自带 HD 610 的核显,对于解码的支持也还不错。

zc_mk的博客 7509

Android之MainActivity类

一、MainActivity: 1、每个种语言都有一个程序入库(如:C#main函数),而Android程序的入口就是Mani Actiivty函数。 2、Activity是Android的核心类(android.app.Activity),在Activity类有onCreate事件方法,一般用于对Activity进行初始化,并且通过setContentVi...

weixin_30762087的博客 1678

GEE:使用 CCDC 算法进行连续变化检测和分类

连续变化检测和分类(CCDC)算法是一种广泛应用于遥感数据分析的方法,可以用于检测土地覆盖变化、农作物生长状态的变化以及水资源的变化等。Google Earth Engine是一个强大的云端平台,提供了丰富的遥感数据和工具,可以用于执行各种类型的遥感数据分析。本文将介绍如何使用Google Earth Engine的CCDC算法进行连续变化检测和分类。

养乐多的博客 5676

Android:细谈Activity四种启动模式

Activity四种启动模式 Activity四种启动模式 Manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.activitytest"> <application android:allowBackup="true" a

JMW1407的博客 315

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

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Activity的四种启动模式深入解析

Activity的四种启动模式深入解析

似霰的博客 4576

计算机控制技术及应用

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

Activity四种启动模式及应用场景

面试的时候科大讯飞的一个面试官问我Activity的启动模式和具体的应用模式;我也一想是啊,平时不太注意,只知道有这几个启动模式,结果到了关键的时刻卡壳了,做个记录: 一、Activity四种启动模式: (一)、基本描述 standard:标准模式:如果在mainfest中不设置就默认standard;standard就是新建一个Activity就在栈中新建一个activity实例; si...

小老鼠的博客 4052

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

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

Android学习之Activity的四种启动模式与特点

Acitivty的四种启动模式与特点activity有四种启动模式,分别为: standard singleTop singleTask singleInstance 可以和activity的flags(通过Intent对象调用FLAG_ACTIVITY_* ,*代表常量)结合使用。默认的启动模式为standard。如下表所示,模式主要分为两组:”standard ”和“ singleTop ”一

一大三千的博客 5453

Activity的四种启动模式浅析

Activity 四种启动模式 standard singleTop singleTask singleInstance

永远不要停下学习的脚步。 3772

Activity中的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。   Android总Activity的启动模式分为四种: Activity启动模式设置: Activity的四种启动模式: . standard 模式启动模式,

knlnzhao的专栏 3万+

Android——Activity的四种启动模式

简介: 我们一个程序会存在不同的Activity,也会存在许多实例,这些实例就会进入任务栈中,任务栈采用“后进先出”的算法,例如:我们使用手机,打开QQ,在QQ界面进入一个聊天界面,此时存在两个Activity实例,假设我们按一下back键我们将回到QQ主界面,在按一下back键我们将回到屏幕主界面,这就是“后进先出”。 Activity的四种启动模式 standard:系统默认使用此启动模式,特性:无论实例存在与否,每启动一次就创建一个实例,如下图所示 singleTop:此启动方法分为两种情况。 一

FranzLiszt的博客 2467

Activity四种启动模式

为什么会有四种启动方式 Activity之所以会有四种启动方式是因为在Android系统中是通过栈结构来保存我们整个App中的Activity,所以一个符合业务需求的任务调度栈可以提高整个项目的性能,栈结构是后进先出的线性表 如上图所示,在默认情况下,当我们从Activity1启动Activity2时Activity2就会放置在启动它的Activity1上面,这时Activity1虽然没有跟用

老实任 1443
上一篇: Android 9.0 新特性
下一篇: gradle的安装与使用
AImmortaI
博客等级 码龄11年 48粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值