android 不同activity切换时它们的回调函数调用逻辑的研究

Android 切换Activity <br /> <br />如果仅仅是表现层的改变,Android layout的转换就可以了。但是如果你需要改变的是功能,是逻辑,那么你就必须要用另一个activity了。<br />activity的切换很简单,首先你必须有两个activity(废话),其次你必须有两个layout,然后就是一个调用activity的方法。<br />以下是代码。<br />第一个activity,也就是主activity/main activity。<br />如果你的程序里有两个activity,那么就自己定义一下哪个 阅读详情
分别监听两个activity的

onCreate

onStart

onRestart

onResume

onPause

onStop

onDestroy

回调函数。


1. 打开act1

打印log如下:

01-16 15:54:32.374: I/peter(13244): ACT1-onCreate
01-16 15:54:32.374: I/peter(13244): ACT1-onStart
01-16 15:54:32.374: I/peter(13244): ACT1-onResume

2.打开act2

打印log如下:

01-16 15:55:29.509: I/peter(13244): ACT1-onPause
01-16 15:55:29.524: I/peter(13244): ACT2-onCreate
01-16 15:55:29.524: I/peter(13244): ACT2-onStart
01-16 15:55:29.524: I/peter(13244): ACT2-onResume
01-16 15:55:29.604: I/peter(13244): ACT1-onStop

3.关闭act2

打印log如下:

01-16 15:56:11.614: I/peter(13244): ACT2-onPause
01-16 15:56:11.639: I/peter(13244): ACT1-onRestart
01-16 15:56:11.639: I/peter(13244): ACT1-onStart
01-16 15:56:11.639: I/peter(13244): ACT1-onResume
01-16 15:56:16.714: I/peter(13244): ACT2-onStop
01-16 15:56:16.714: I/peter(13244): ACT2-onDestroy

为什么会出现这种2个activity交叉调用的逻辑呢?

为什么不全部回调完当前的activity的函数。再回调要显示的activity函数。这样的逻辑不是更简单明了么。


第1种说法是:先回调要显示的activity 再回调 onstop()  ondestory()当前的activity。这样会提高系统流畅性。

我们知道所有的回调函数都是在ui 线程中调用的。所以,先后顺序的差别,是无法提高系统流畅性的。

所以这种说法是错误的。


第2种说法是 activity支持动画切换造成了这种逻辑。

验证一下:(由于不能监听activity的切换动画,只好通过增加动画显示的时间如:用5000毫秒来显示动画。)

执行上面的3 步骤时发现如下现象。

01-16 16:07:01.544: I/peter(13244): ACT2-onPause
01-16 16:07:01.569: I/peter(13244): ACT1-onRestart
01-16 16:07:01.569: I/peter(13244): ACT1-onStart
01-16 16:07:01.569: I/peter(13244): ACT1-onResume

正常显示。

过了很久直到动画显示完成才出现下面的log。

01-16 16:07:06.649: I/peter(13244): ACT2-onStop
01-16 16:07:06.649: I/peter(13244): ACT2-onDestroy

显然第2种说法是有道理的。

解释:

如果activity切换动画的时间很长。如果又不按照系统提供的调用顺序。直接全部回调完当前的activity的函数。再回调要显示的activity函数。

会造成这种可能:当前的activity 它的ondestory() 被调用了。view 被虚拟机回收了。但是它还再做动画。这时null 空指针出现了。于是软件崩溃。


demo下载:

http://download.youkuaiyun.com/detail/javalive09/6855725



安卓Activity劫持与反劫持 安卓Activity劫持与反劫持 0x00前言 近日,挪威一家APP安全公司Promon发现并报道了一个特性漏洞已经被多个恶意应用利用的分析报告,他们通过监测发现该漏洞使恶意软件可以伪装成任何合法的应用程序,从而使黑客可以访问私人短信和照片,窃取受害者的登录凭据,跟踪位置或记录电话对话,甚至可以通过手机摄像头和麦克风进行监视。 研究人员将该漏洞命名为StrandHogg,这是北欧人的一种北欧海盗... 阅读详情

相关推荐

Android横竖屏切换时Activity的生命周期

在Android开发中,当用户将设备从横屏切换到竖屏或者从竖屏切换到横屏时,Activity会经历一系列的生命周期变化。这些变化会影响到Activity中的状态和数据,因此开发者需要了解这些生命周期的变化,以便在切换过程中正确处理相关逻辑。可以从Bundle对象中获取之前保存的数据,并进行相应的恢复操作。在Android中,当屏幕方向发生变化时,系统会销毁当前的Activity并重新创建一个新的Activity实例。需要注意的是,系统在销毁和重新创建Activity时,会自动调用这些方法来保存和恢复数据。

2301_79326930的博客 842

Android 两个Activity切换时回调函数调用顺序

Activity A 启动Activity B之后,各个回调函数被调用的顺序

bigconvience的专栏 3842

Android滑动切换Activity实现详解

Fragment的生命周期方法包括onAttach(), onCreateView(), onActivityCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDetach()等。每个方法都有其特定的调用时机,根据Fragment所处的状态来执行相应的操作。onAttach():当Fragment与Activity关联时调用。:创建Fragment的视图层次结构时调用。

weixin_42560991的博客 1137

android 调用其他activity方法,如何从另一个类调用MainActivity中的方法?

您只需执行以下操作即可轻松地从Activity中的任何Fragment调用方法:((MainActivity)getActivity()).startChronometer();希望这可以帮助!首先初始化它MainActivity mActivity= new MainActivity();然后你可以继续mActivity.startChronometer();我建议,不应该成为Activity类...

weixin_35926485的博客 4844

实现安卓Activity流畅动画切换:源码解析

本文还有配套的精品资源,点击获取 简介:本文深入探讨了在安卓开发中通过源码实现四种基本动画类型:translate(平移)、scale(缩放)、alpha(透明度变化)以及rotate(旋转),并将这些动画应用于Activity切换过程,增强用户界面的流畅性和动态性。文章首先介绍每种动画的效果和创建方法,然后详细说明了如何设置动画监听器、应用动画、组合多个动画,并最终启动动...

weixin_35751194的博客 1931

Android Activity切换动画实战指南

本文还有配套的精品资源,点击获取 简介:在Android开发中,Activity切换是用户界面的重要组成部分。本指南提供了一个无错的Activity切换动画实现,涵盖了自定义动画、共享元素过渡和Transition API的使用。通过实践任务,学生将掌握如何创建流畅且吸引人的过渡效果,同时考虑性能和兼容性。本指南旨在帮助学生提升Android应用的用户体验,为未来的开发奠定...

weixin_30633869的博客 1278

【Android】利用Activity生命周期监听应用前后台切换

~转载请注明:http://blog.youkuaiyun.com/u013015161/article/details/46762991实现介绍在Android应用开发中,我们有时候需要监听到应用前后台的切换。这里提供一种思路,该思路并非原创,而是一种比较通用的办法,这里做一下介绍,附带实际过程中遇到的问题的解决。 具体实现思路是通过重写Activity的onResume方法和onStop方法实现,即在on

Lankton 1万+

泰克示波器TDS210改装便携示波器

泰克示波器TDS210改装编写示波器

超级网吧的博客 3079

Android 两个切换时Activity的生命周期

这里说了两个Activity之间,用默认模式切换的生命周期。 代码: MainActivity package com.example.lifecycletest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import a...

Zero_HWA的博客 1789

AD9253 LVDS 高速ADC驱动开发

对应:data clock时钟为500M DDR mode。具体内容:下文的参考博客写的很清楚,我就不详细写了。参考博客clock align模块不完整,本文新增这个模块。3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。2、查阅Xilinx xapp524手册。1、查阅AD9253器件手册。

CAOXUN_FPGA的博客 2106

开坑!双向逆变电源实操系列--第一节PFC

文章摘要 本文介绍了PFC(功率因数校正)的基本概念及其重要性。PFC电路通过储能和功率因数校正两大功能,解决交流电小电压大电流的问题,并减少无功电流损耗。文章对比分析了无源PFC(电感串联式、填谷式、LC谐振式)和有源PFC(升压型、交错并联、图腾柱式)的拓扑结构及适用场景。针对2400W双相逆变电源设计,作者选择图腾柱PFC拓扑,详细阐述了设计思路,包括电气参数计算、性能指标设定、技术重点及风险预判。文章还提供了主电路参数定制计算方法,如BOOST电感值的推导过程,为电源工程师提供实用参考。

lyzh971103的博客 2545

有关安卓的Activity前后台切换

本文仅是AI问答记录备忘。

x5237732的博客 2785

InSAR_ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场

ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场 ISCE软件做干涉只需要将数据准备好,并配置好insarApp.xml文件即可进行。 一、数据准备 1、SAR数据获取 本利中使用的数据为欧空局提供的sentinel-1A/B数据,可从阿拉斯加数据服务器上下载,具体下载方法可参考: 哨兵数据下载方法. 2、哨兵卫星轨道文件下载 哨兵数据处理除了需要SAR影像外,还需提供轨道参数文件,可从https://qc.sentinel1.eo.esa.int/aux_poeorb/下载。下载

weixin_42128764的博客 1万+

Activity切换时生命周期执行顺序

(账号被盗,所有文章被删,只能一篇篇去删除里面恢复) Android中生命周期方法都是由系统调用,系统会根据当前Activity的不同状态回调相应的方法。 1、Activity的生命周期: onCreat():当Activity第一次被创建时回调的方法,加载当前Activity的布局或者初始化View或者加载数据到集合等。 onStart():当Activity能够被用户看到时调用的方法。...

shixhe的博客 8278

VLP16:使用pointcloud_to_laserscan将三维点云转化为二维LaserScan

velodyne16线激光雷达 VLP16:使用pointcloud_to_laserscan将三维点云转化为二维LaserScan

NEUer_ljx的博客 4619

ICS v9.5 OverbyteIcsWSocket.pas 整体架构分析

核心架构:OverbyteIcsWSocket.pas 是 Internet Component Suite (ICS) 的基础网络组件单元,提供跨平台 Winsock API 封装,支持TCP/UDP 客户端/服务器,DNS 解析和Raw Socket。在 v9.5 中,SSL/TLS 代码已分离至 OverbyteIcsSslBase.pas 等单元,使核心单元更精简,专注于非加密 socket 操作。

sonadorje的专栏 992

【Activity】安卓Android开发中的Activity、Fragment、Adapter

我最近刚刚接触Android开发,对这个方面的开发可以说是一无所知,所以想着尝试开始理解。在这段时间的摸爬滚打里面,我发现了其中Activity、Fragment、Adapter三种非常常用,所以在这里进行一下我自己的理解。

weixin_67898144的博客 2792

基于Simscape的双PID比例调速阀与比例溢流阀液压控制系统建模与仿真

本文提出了一种基于Simscape的双PID液压控制系统建模方法,通过比例调速阀和比例溢流阀实现液压缸速度与压力的解耦控制。系统采用Simscape Fluids物理建模,精确模拟液压元件非线性特性。文章详细介绍了液压被控对象建模过程,包括动力单元、比例阀组合建模、执行机构及传感器配置。同时设计了双PID控制器架构,分别控制速度环和压力环,并给出参数整定建议。该方法通过物理网络直接模拟流体流动和压力动态,相比传统传递函数法具有更高精度,为液压系统仿真提供了有效解决方案。

AI的内部世界的博客 284

Android设备切换系统模式时导致Activity重建

当添加了android:configChanges="uiMode"后,系统将不会简单的销毁重建Activity来响应UI模式(如模式切换)系统将调用Activity的onConfigruationChanged(Configuration newConfig)方法,在方法中你可以处理与UI模式相关的任何更改,比如更新UI的颜色方案。如果你的应用依赖于某些特定的配置,或者配置变化会导致复杂的UI调整,那么确保你在onConfigurationChanged方法中实现了这些逻辑是非常重要的。

m0_63307502的博客 1957

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 160

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

源码解析横竖屏切换时ViewModel的mViewModelStore的存储即onRetainNonConfigurationInstance()调用逻辑

横竖屏切换的时候会调用ActivityThread中的handleRelaunchActivity()看名字就知道是要重新启动Activity,handleRelaunchActivity()有个handleRelaunchActivityInner(),从handleRelaunchActivityInner()这个方法开始进入正题:

Allence的博客 2601

计算机控制技术及应用

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

android如何通过TextView实现不同的Activity的切换

这是自己写的第一篇优快云的博客,由于今年暑假(大三)才决定好自己的发展方向,java基础学的也一般,所以暑假找实习的时候一直碰壁,之后经过反思,决定重新学java,然后继续来学习android,现在自己是想做一个简单的个人信息介绍,然后用App的形式展现出来,现在第一个要解决的问题就是如何通过最下方的TextView来实现不同Activity(界面)的切换,先把这个效果实现,然后继续添加新的东西

小坏蛋-辉的博客 1313

VB摄像头监控

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 语言切换时发生了什么,源码是怎么调用的,对我们app有何影响,我们该怎么做去避免发生异常

在做应用的时候经常会碰到多语言的适配,在我们切换语言时候,我们的app到底发生了什么呢?以及切换语言经常出现的错误问题,比如空指针,fragment的问题等等。对于怎么适配多语言今天不是重点,重点是语言切换后我们的app去做了什么让她的语言发生了变化。以下情况都是在我们打开页面之后切换语言的,也就是我们app在前台,然后切换语言。 (1)切换语言时代码调用流程 (2)切换语言时候最容易导致的问...

王项雨 的博客 1205

Android基础——Activity

Android基础一级目录二级目录三级目录 一级目录 二级目录 三级目录

松仔Log的博客 3万+

android学习——activity生命周期和切换逻辑

首先看一下Android api中所提供的Activity生命周期图: 只看图片并不会清楚它的运行机制,有了下面的解释就会豁然开朗了。 先看一下谷歌的API解释: 方法 描述 是否可以终止 下一个方法 onCreate() 当Activity程序启动之后会

linlif的博客 468
上一篇: idlehandler实现 android splash 闪屏界面
下一篇: addView 源码调用顺序的迷惑
javalive09
博客等级 码龄16年 43粉丝 281原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值