Android - Acitivty生命周期 理解

Android 中高级面试题:Activity是如何实现LifecycleOwner的? 1、SupportActivity Activity通过继承SupportActivity实现LifecycleOwner接口。注意在AndroidX中SupportActivity改名为ComponentActivity。 public class SupportActivity extends Activity implements LifecycleOwner { … private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistr 阅读详情

1、Activity的四种状态

理解Activity的生命周期之前,先理解对android的生命周期的特点进行整理,从而归纳出的Activity的四种活动状态。

那么,通常来说,一个Activity的整个生命周期内,会经历如下的几种状态:


  • 运行状态:

         * 当一个Activity位于返回栈栈顶的时候,既是处于这种状态之下。

       

         PS:系统最不愿意回收处于运行状态下的Activity,因为这回给用户造成很糟糕的体验


  • 暂停状态:

        * 当一个Activity不再位于栈顶,但却又处于“用户可见”的状态下的时候,既是位于暂停状态。

       

        通常我们理解,一个Activity被另一个Activity“压栈”,而离开栈顶,既是有一个新的“界面视图”进入。

        那么什么时候一个Activity会出现不再位于栈顶,却又被用户可见的情况呢?

        Android中,并不是所有的活动都会占满整个屏幕,例如新压入栈顶的Activity是一个对话框形式的活动时,前一个Activity则会进入到这种所谓的暂停状态。


        暂停状态下的Activity无法响应用户的操作,但仍然是被用户可见的,所以系统仍然不愿意去回收此状态下的Activity。


  • 停止状态:

        * 当一个Activity不再位于栈顶,并且不再被“用户可见”的时候,就进入到了停止状态。


        PS:处于停止状态的活动最大的特点是:系统仍然为其保存相应的状态和成员变量,但这并不是绝对可靠的。

        这是因为位于该种状态下的Activity,在一些其他优先级更高的程序需要内存的时候,系统会选择回收释放掉该状态下的Activity,以提供足够的内存。


        所以,如果在你的某个Activity中,如果有一些该活动重新回到栈顶时,需要“重现”的数据的话,

        为了避免这种状态下的意外发生,可以选择在onSaveInstanceState()方法中保存信息,在下次活动恢复的时候从onCreate()方法中进行恢复,避免数据丢失。


  • 销毁状态:

        * 当一个活动从返回栈中被移除时,就处于销毁状态了。系统最倾向于回收这种活动,以保存手机内存的充足。


2、Activity的7种生命周期方法的理解

前面说到了所谓的四种活动状态,其实就是根据Android的生命周期的各个阶段的特点归纳出来的,所以我们自然也应该理解这7种生命周期的特点,它们分别是:

   - onCreate()
    * 在一个活动初次被创建时调用.    
    * 通常应该在这个方法里完成活动的初始化事件,如:加载布局,初始化控件,绑定事件等等..
    
   - onStart()
    * 在活动由不可见变为可见时调用.
    
   - onResume()
    * 当一个活动准备好和用户进行交互时进行调用。此时的活动一定位于返回栈的顶端,处于运行状态。
    
   - onPause()
    * 在系统准备去启动或恢复另一个活动的时候调用。
    * 通常在这个方法内将一些消耗CPU的资源释放,以及保存一些关键数据。
    * 但该方法内的内容执行速度一定要快,也就是说不要在此方法内做耗时操作,否则会影响新的栈顶活动的使用。
    
   - onStop()
    * 在活动完全不可见的时候调用。
    * 和onPause的调用特点类似,但最大的不同在于,例如:
       从当前活动启动的是一个对话框形式的Activity,onPause会得到调用,而onStop不会调用。

   - onRestart()
    * 这个方法在活动由停止状态变为运行状态之前调用,也就是重新启动。 
   
   - onDestroy()
    * 在活动即将被销毁之前调用,调用完毕后该活动进入销毁状态。
    


3、Activity生命周期图

为了更好的对Android中一个Activity在实际运行过程中,生命周期阶段变化的理解,我们结合官方的说明图加深印象。



从这张图中,我们可以归纳得到以下几种情况:

1、当一个Activity初次被创建时,会经过onCreate → onStart → onResume,此时该活动便已经压入栈顶,进入到了运行状态。


2、此时如果有另一个Activity来到前台,可分为我们上面说到的两种情况:

  • 新进入前台的是“对话框式”的Activity,此时onPause方法被调用,活动进入到暂停状态。而当活动再次返回时,直接调用onResume方法后恢复到运行状态。
  • 新进入前台的是普通的Activity,此时当前我们的Activity进入到不可见状态,经历onPause → onStop方法后,进入停止状态;若再次返回,则经历onRestart → onStart → onResume后,重新启动进入到运行状态。

3、在Activity执行onStop()方法进入到停止状态后,如果出现“另一个优先级更高的地方需要内存”的情况,进程被杀死,此时如果想要返回,则会重新经历onCreate → onStart → onResume的过程,从而恢复到运行状态。

4、当执行完onDestory方法后,Activity则会被系统销毁,进入到销毁状态之中了。


4、结合实际代码测试、加深理解
书止于此,理论上 我们对Android中Activity的生命周期已经有了一个较为全面的理解。
但我们不能满足于做一个书面上的巨人,于是我们通过实际的代码来对我们的理解进行一个验证,加深理解。

我们的大体思路是:
1、建立一个MainActivity,用于测试生命周期
2、建立一个普通的Activity,用于测试活动被覆盖进入到不可见状态下的生命周期方法执行情况。
3、建立一个对话框式的Activity,用于测试活动不挤出栈顶,但仍然可见下的情况下的生命周期情况。

根据我们的思路书写代码,首先是MainActivity:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class LifeCycleTestMainActivity extends Activity {

	private final String TAG = "LifeCycleTestMainActivity";
	private Button start_normal_activity;
	private Button start_dialog_activity;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.v(TAG, "onCreate...");
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.life_cycle_main_layout);

		// 恢复数据
		if (savedInstanceState != null) {
			String tempData = savedInstanceState.getString("tempData");
			// do something...
		}
		initView();
	}

	private void initView() {
		start_normal_activity = (Button) this.findViewById(R.id.start_normal_activity);
		start_dialog_activity = (Button) this.findViewById(R.id.start_dialog_activity);

		start_normal_activity.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(LifeCycleTestMainActivity.this, LifeCycleNormalActivity.class);
				startActivity(intent);

			}
		});

		start_dialog_activity.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(LifeCycleTestMainActivity.this, LifeCycleDialogActivity.class);
				startActivity(intent);

			}
		});

	}

	// 保存临时数据,避免活动进入到“停止状态”时,被系统回收,数据消失的问题
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		String tempDate = "some temp data have need saved";
		outState.putString("tempData", tempDate);
	}

	@Override
	protected void onStart() {
		Log.v(TAG, "onStart...");
		super.onStart();
	}

	@Override
	protected void onResume() {
		Log.v(TAG, "onResume...");
		super.onResume();
	}

	@Override
	protected void onPause() {
		Log.v(TAG, "onPause...");
		super.onPause();
	}

	@Override
	protected void onStop() {
		Log.v(TAG, "onStop...");
		super.onStop();
	}

	@Override
	protected void onRestart() {
		Log.v(TAG, "onRestart...");
		super.onRestart();
	}

	@Override
	protected void onDestroy() {
		Log.v(TAG, "onDestroy...");
		super.onDestroy();
	}

}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/start_normal_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="start normal activity"
        android:textSize="20sp" />

    <Button
        android:id="@+id/start_dialog_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/start_normal_activity"
        android:text="start dialog activity"
        android:textSize="20sp" />
    

</RelativeLayout>

接着是NormalActivity与DialogActivity的类文件与布局文件,它们十分基本,只用于测试“activity跳转”时,MainActivity的生命周期变化情况,唯一需要记得就是,
为了让DialogActivity以对话框形式出现,我们再mainfest.xml文件中加以配置:
<activity android:name=".LifeCycleDialogActivity" android:theme="@android:style/Theme.Dialog"/>

搞定,接下来我们运行程序,进行测试:
1、首先是该程序初次运行时,我们查看log日志,得到:


结果与我们从第三部分的流程图中得出的结论一致,初次启动某个Activity时,经历了:onCreate → onStart → onResume。
从而进入到运行状态,一直处于可见状态下与用户进行交互。

2、直到我们点击了"start_normal_activity"按钮,于是normal activity进入前台,此时我们再次查看日志,得到:



日志打印的结果与我们总结的依旧一致,由于新的”NormalActivity“进入返回栈顶,并且"MainActivity"已经进入到不可见状态。
所以MainActivity此时尽力了:onPause →  onStop的过程,进入了停止状态。

3、此时我们点击回退键,返回MainActivity,再次查看日志:



OK,依旧如我们所想,MainActivity由停止状态恢复到运行状态,经历了:onRestart → onStart → onResume。

4、这次我们选择点击另一个按钮"start_dialog_activity",于是"DialogActivity"进入到栈顶,并且!MainActivity不再位于栈顶,但其仍然处于可见状态,让我们再次查看日志,看看发生了什么:



验证成功,由于MainActivity虽然不再位于栈顶,但其仍然处于可见状态,所以其经历的过程仅仅为:onPasue。


5、再次点击回退键,返回MainActivity,查看日志:



很高兴,依然与我们料想的一样,从暂停状态中恢复,我们只经历了一步:onResume.


6、我们已经位于我们的主界面"MainActivity",此时再次点击回退键,查看日志:


事实上,我们此时再次点击回退键的时候,我们最直观看到的就是:"屏幕返回到了系统的主界面"。
所以我们不难想到,MainActivity离开栈顶,并且进入了不可见的状态,它自然同样会经历:onPause →  onStop。
而与此同时,实际上这时离开栈顶的MainActivity实际上已经是位于返回栈中唯一的Activity了,
当一个程序的返回栈中已经没有任何活动,我们最通俗的理解也就是"我们已经退出该应用了"。
所以这个时候系统紧接着又执行了onDestroy方法,然后销毁掉了MainActivity。

至此,我们"理解完了Android中Activity的生命周期,退出了应用"。

基于STM32的简易电压、频率、占空比测量仪 任务详解:我们需要实现三个功能: 第一个是测频率的功能,输入信号为频率为1kHz~10kHz的三种波形(方波、三角波、正弦波),这也是我们最常见的三种波形。幅度是不需要测量的,所以先不关心幅度。 第二个是电压报警功能,当输入信号的幅度超过15V时,我们需要报警(这里我用了一个红色LED当报警器,有条件的还可以加个蜂鸣器)并且把此时的信号幅度显示在OLED屏幕上。 第三个是通信方式的要求,需要有串口通信功能。 第四个是计算占空比的任务,这个任务的输入是幅度为1V~10V、频率为20Hz ~1kHz的方波,需要 阅读详情

相关推荐

CAN信号定义避坑指南:Kvaser Database Editor里Byteorder和Bitpos设置的那些‘坑’

本文详细解析了在Kvaser Database Editor中配置CAN信号时,字节序(Byteorder)和起始位(Bitpos)设置的常见错误及解决方案。通过实际案例和验证技巧,帮助工程师避免DBC文件配置中的陷阱,确保车载电子系统的稳定通信。

weixin_28678831的博客 360

Acitivty生命周期

为什么80%的码农都做不了架构师?>>> ...

weixin_33730836的博客 417

PCB布局规范及其注意事项(纯干货)

这样做的好处是信号1,3层不会有串扰,4和5作为电源有紧密的耦合,3个信号层都有GND平面可以参考,且不会互相产生串扰,唯一的缺点是布线的层面只有3个信号层(信号03的是最适合来传输高速信号,因为该层的二面都有屏蔽,防止干扰传出,也防止干扰传入)33、影响阻抗匹配的参数(ER介电常数(1GHZ以下默认为4.2,以上的话问板厂),H介质厚度(就是内层压合的PP片厚度),W走线的线宽,T走线的厚度(铜厚/减小线的厚度可以增大阻抗))我这里使用的是CITS25来计算阻抗。

qq_42379138的博客 8842

Acitivty四种启动模式

Acitivty的四种启动模式   在清单文件中声明 Activity 时,您可以使用<activity>元素的launchMode属性指定 Activity 应该如何与任务关联。 launchMode属性指定有关应如何将 Activity 启动到任务中的指令。您可以分配给launchMode属性的启动模式共有四种: 1.standard(默认模式)  ...

banyinlve3147的博客 271

基于Python的股票K线图爬取与形态识别系统

本文详细介绍了一个基于Python的股票K线图爬取与形态识别系统。该系统通过网络爬虫技术获取股票历史数据,使用Matplotlib生成K线图,并应用卷积神经网络(CNN)对经典K线形态进行识别。文章详细阐述了数据采集、K线图生成、CNN模型构建与训练的完整流程,并提供了完整的代码实现。本研究为金融科技领域的毕业设计提供了有价值的参考方案。关键词:Python爬虫、K线图、卷积神经网络、形态识别、股票交易。

2201_76125261的博客 1033

贝叶斯时空模型-INLA-4

该文章中,会简化数学计算的过程,主要是针对,在有数据的基础上,如何应用贝叶斯时空模型,找出影响因素,绘制时间变化的空间分布预测图。上述中关键一步与前几期介绍的不一样的地方是,我们加入了n.group参数,用来指定年份,先看一下Year有多少年的,然后封装在s.index里面。在前述的内容中,我们介绍了,如何处理空间的数据,利用海拔高度预测降雨量的例子。建立好数据及mesh以后,我们现在写INLA公式,如果不考虑残差项,那就是固定效应,现在我们增加残差项,及空间与时间效应。这里的Mesh设定值为10,20。

学习中 2947

Android四大组件之Activity详解

Activity生命周期: onCreate:在Acitivty第一次创建时调用,用于做初始化的工作 onStart:onCreate调用后调用,此次界面对用户来说无法看见 onResume:此次界面可见并显示到前台,且当前Acitvity位于当前栈顶,并且处于运行状态 onPause:表示当前Activity正在停止,常做一些存储数据、停止动画等工作(不做耗时操作) o

Deer 527

逆向分析顶象5代各类验证码类型的图片还原方法(附源码)

6.刷新滑块验证码图片,会进入之前的for循环断点,分析此处的代码会发现,该循环循环了处理了n字符串的值,取出n字符中的值并使用charCodeAt生成Unicode 编码,然后又调用了a函数,如果a函数返回true就会把之前生成的Unicode编码+1,a函数参数分别是c数组和Unicode取余32后的值,然后再把Unicode取余32后的值push进c数组,这里的n值为滑块碎片背景图的name。2.搜索"ranges":,会找到ranges赋值的地方,在此处代码断点,并点击跳过断点,结束此次调试。

老衲爱洗头的博客 1195

Android activity 启动流程

本文主要记录下acitivty的启动流程.

赵航的博客 2218

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 267

0.1 专栏导读:为什么需要从 MM 理解 HMM

本文探讨了GPU计算框架中CPU与GPU内存管理的困境,介绍了Linux内核的HMM(Heterogeneous Memory Management)解决方案。传统显式拷贝模型存在编程复杂、指针失效等问题,而HMM通过共享虚拟地址空间、自动页面迁移等机制实现透明内存管理。文章分析了HMM依赖的Linux内存管理基础设施,包括页表遍历、MMU通知、ZONE_DEVICE等核心组件,并梳理了从经典MM到支持异构设备的进化历程。最后给出了学习HMM的8层知识体系,强调理解底层MM机制是掌握HMM的关键。

图形/计算GPU的驱动与虚拟化技术分享园地 757

Android Activity生命周期

1.activity Activity是由Activity栈管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部。Acitivity一般意义上有四种状态: ①当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于运行状态; ②当Activity失去了焦点,但仍然对用户可见(如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕),此时处于暂停状态; ③当Activity被其他Activity

zenmela2011的专栏 7089

让openclaw接入web端的deepseek或着qwen,使用无限token

🪟 Windows: 提供原生的 PowerShell 一键安装支持!配置过程和官方版本是相同的,唯一的区别就是再选则model时要选择带Browser字样的deepseek或者qwen。安装之前需要先清理官方版本的安装痕迹,否则openclaw版本跳转不到这个中文版本。因为此版本与官方版本存在代差,在配置飞书时可能会出现无法安装飞书的情况。剩下的配置保持和官方版本一致操作即可。选中之后需要进行一次网页端的登录。登录后会出现可选择的model。安装完成后会跳到这个中文界面。涉及到接入飞书机器人的操作。

z1872385的博客 302

Android Acitivty 启动方式

设置Activity的启动模式,只需要在AndroidManifest.xml里对应的标签设置Android:launchMode属性,例如:<activity android:name=".A1" android:launchMode="standard" /> standard 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可

ai2810806439的博客 432

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

activity 生命周期_如何理解安卓activity的生命周期(on-create篇)?

个人认为用类比的方式来学习新事物比较容易接受。我这里用蝴蝶的一生来做比喻。OnCreate阶段就像是蝴蝶的幼虫刚出卵里孵化出来,蝴蝶的一生只可能出生一次,oncreate只能被创建一次。蝴蝶刚出生的时候还不是蝴蝶,而是一只毛毛虫一样的东西,需要破壳而出。 那么在安卓onCreate这个阶段,我们又需要做些什么呢?根据官方文档In the onCreate() method, you perform...

weixin_39517054的博客 175

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

多个Acitivty跳转与传值

Activity跳转与传值,主要是通过Intent类来连接多个Activity,以及传递数据。 Intent是Android一个很重要的类。Intent直译是“意图”,什么是意图呢?比如你想从这个Activity跳转到另外一个Activity,这就是一个意图。Intent类在Android系统中的作用很大,在此不详细说了,后面有文章介绍!   Activity跳转,无返回

LilySea2012的专栏 994

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android Activity 生命周期的透彻理解

Android Activity 生命周期的透彻理解      说来惭愧,虽然已经做了一年多的android开发,但是最近被人问起activity的生命周期的时候,却感觉自己并不能很自信很确定的回答对方的问题,对activity的生命周期的理解还不透彻啊。      既然发现了问题,那咱就得解决问题,不就个生命周期,能有多复杂。      首先看看android develope

Leaning_wk的专栏 525

理解和使用Activity生命周期,启动模式,横竖屏转换的生命周期

参考activity生命周期(这篇足够了) Activity 生命周期详细解释 Android 深刻理解Activity生命周期的作用及意义 理解activity的生命周期,有助于我们完成很多优化工作 onCreate(): 当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。 onSt...

skyang在路上 196

Android Activity生命周期大全详解

Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码: [java]view plaincopy publicclassActivityextendsApplicationContext{ protectedvoidonCreate(BundlesavedInsta...

djun100的专栏 249

Android复习-Acitivity的生命周期(二、异常情况下的各种回调)

首先来明确一下何为异常情况: Acitivty被异常杀死,例如Activity在后台时由于内存不足或一键清理引起的杀死,或者Acitivty的配置发生变化时,例如横屏转为竖屏。 这些情况都会导致Activity执行“死亡”流程,并且再执行创建流程。 进入一个Activity: A...onCreate A...onStart A...onResume 然后进行横屏: 03-13 11

Ade-rui的博客 618

快速掌握activity的生命周期

activity的生命周期不管是在面试还是在工作中我们都会经常遇到,这当然也是非常基础的,基础也很重要哦,学会activity的生命周期对我们以后开发更健壮的程序会有很大帮助。下面来看一下Activity生命周期图: 为了便于理解,我简单的写了一个Demo,不明白Activity周期的朋友们,可以亲手实践一下,大家按照我的步骤来。 第一步:新建一个Android工程,我这里命名为M...

蓝色妖姬 115

Activity跳转时的生命周期

2020-03-29 10:48:11.748 8812-8812/? I/ActivityA: onCreate called. 2020-03-29 10:48:11.758 8812-8812/? I/ActivityA: onStart called. 2020-03-29 10:48:11.762 8812-8812/? I/ActivityA: onResume called. 20...

guodashen007的博客 275

Fragment理解

Fragment在Android中又称为碎片,碎片(Fragment)是一种可以嵌入在活动当中的 UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛。 Fragment的状态和回调: 1.运行状态,当Fragment处于可见, 并且他关联的activity处于运行状态时,他就处于运行状态。 2.暂停状态,当于Fragment关联的activity处于暂停状态(由

Little_Boy 520

Android-----activity组件

Android中的activity组件表现为与用户交互的可视化界面。用户定义的activity都必须继承与父类,一个应用程序可以油多个或一个activity组成,Android平台通过activity栈来管理activity。每一个Activity都被分配一个用于绘制的窗体,一般来说,这个窗体是全屏的,但也可以比全屏小且浮于其他窗体之上。窗体上的可是内容油一组视图元素组成,这些视图元素都...

dia7964的博客 184

android-Activity-Window-View

感谢mingli198611的分享

duduxi的博客 351

安卓启动流程与期间核心组件工作原理

本文以实际工作中出现的启动相关各种千奇百怪的bug为钩子,讲解了安卓app冷启动过程中核心组件的工作原理,pms -> packageParser/androidmanifest.xml -> context -> ams -> application -> activity -> layoutInflater资源加载过程 -> wms /window/WM -> view与viewgroup绘制原理 -> 渲染阶段。理供解决问题的思路,看业务框架代码能看懂他们改的哪块源码,跟他们扯皮能扯赢

mix39的博客 337
上一篇: Android — 长按ListView 利用上下文菜单(ActionMode) 进行批量事件处理
下一篇: 对Android-MVP架构模式的理解与初尝试
LaterEqualsNever
博客等级 码龄12年 297粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值