Android开发之活动的使用(二)

Android应用程序开发——安卓应用开发介绍 这是网易公开课 密西西比河谷州立大学:Android应用程序开发 的笔记,旨在 阅读详情

活动

1.日志文件概述

使用Android中的日志工具Log

  • Log.v() 用于打印那些最为琐碎的、意义最小的日志信息。对应级别verbose,是 Android日志里面级别最低的一种。
  • Log.d() 用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。 对应级别debug,比verbose高一级
  • Log.i() 用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分 析用户行为数据。对应级别info,比debug高一级
  • Log.w() 用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修 复一下这些出现警告的地方。对应级别warn,比info高一级
  • Log.e() 用于打印程序中的错误信息,比如程序进入到了catch语句当中。当有错误信息 打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别error, 比warn高一级。
为什么使用Log而不使用System.out

System.out的缺点:比如日志打印不可控制、打印时间无法确定、不能 添加过滤器、日志没有级别区分……

2.活动概述

活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用 户进行交互。一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见

3.活动的基本用法

活动的一些基本概念

现在右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建活动的对话框,我们自己设置一下活动名称和对应的布局文件名称就完成了一个活动文件的创建。

完成创建活动之后Audio Studio会自动继承appCompatActivity并**重写onCreate()方法

在Android 10版本中,一个活动如果需要使用它,还需要再Manifest文件中注册这个文件,否则活动将不能被使用。

<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

以上是一个活动的注册代码,其中intent-filter中的两段代码主要是将此Activity设置为程序的入口(运行此app后首先进入的界面)。

注意

自动创建的xml布局文件为约束布局。

约束布局

对于一些看起来相对较为复杂的布局文件,为了防止嵌套过多导致的活动加载速度较慢,功耗过大。Google公司于2016年发布了约束布局,这个控件需要Android Studio2.2Preview支持可视化编辑工具。约束布局属于可视化的布局,上手相对来说更简单。

在活动中使用Menu(略)

主要完成了在app下边栏中显示菜单按钮

销毁一个活动

finish()方法可以销毁当前活动(一般用于跳转完成之后)

// 通常情况下的调用情况
// 需要让主类继承点击接口,然后重写onClick(View v)方法
@Override
public void onClick(View v) {
    finish();
}

button_name.setOnClickListener(this);

4.使用Intent

4.1 使用显示Intent

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Class cls) 。

这个构造函数接收两个参数。

  • 第一个参数Context 要求提供一个启动活动的上下文
  • 第二个参数Class 则是指定想要启动的目标活动。
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
    }
});

4.2 使用隐式Intent

隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指 定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并帮我 们找出合适的活动去启动。

修改Manifest文件中的Activity的intent-filter标签,可以指定当前活动能够响应的action和category

<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

然后修改Activity中的按钮的点击事件

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.example.activitytest.ACTION_START");
        startActivity(intent);
    }
});
注意

显示调用和隐式调用Intent属于对Intent构造函数的重载

4.3 花式使用Intent对象

// 使用Intent借用系统浏览器打开百度
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }
});

5.向下一个Activity传递数据

在启动活动时传递数据的思路很简单,Intent中提供了一系列putExtra() 方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。

  • 由此可见Activity中自带了一个intent对象来存储数据

5.1 发送数据

// 向下一个Activity发送数据
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String data = "Hello SecondActivity";
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        intent.putExtra("extra_data", data);
        startActivity(intent);
    }
});

5.2 接收数据

// 另一个Activity接受响应数据信息并打印
public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);
    }
}

6.活动的生命周期

掌握活动的生命周期很重要。因为当你深入理解活动的生命周期之 后,就可以写出更加连贯流畅的程序,你的应用程序将会拥有更好的用户体验。

6.1 Android 活动的机制

其实Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合, 这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish() 方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

6.2 活动的状态

  1. 运行状态

当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处 于运行状态的活动,因为这会带来非常差的用户体验。

  1. 暂停状态

当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。你可能会觉 得既然活动已经不在栈顶了,还怎么会可见呢?这是因为并不是每一个活动都会占满整个屏幕的,比如对话框形式的活动只会占用屏幕中间的部分区域,你很快就会在后面看到这 种活动。处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动(因为 它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的 情况下,系统才会去考虑回收这种活动。

  1. 停止状态

当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。系统仍然会 为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。

  1. 销毁状态

当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。

6.3 活动的生存期

Activity类定义了7个回调方法,覆盖了活动生命周期的每一个环节

  • onCreate() :这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

  • onStart() :这个方法在活动由不可见变为可见的时候调用。

  • onResume() :这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。

  • onPause() :这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。

  • onStop() :这个方法在活动完全不可见的时候调用。它和onPause() 方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause() 方法会得到执行, 而onStop() 方法并不会执行。

  • onDestroy() :这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

  • onRestart() :这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

6.4 一些相关概念

  • 完整生存期:活动在onCreate() 方法和onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate() 方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。
  • 可见生存期:活动在onStart() 方法和onStop() 方法之间所经历的,就是可见生存 期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在onStart() 方法中对资源进行加载,而在onStop() 方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
  • 前台生存期:活动在onResume() 方法和onPause() 方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的, 我们平时看到和接触最多的也就是这个状态下的活动。

6.5 活动被回收的数据处理

前面我们已经说过,当一个活动进入到了停止状态,是有可能被系统回收的。

eg.MainActivity中有一个文本输入框,现在你输入了一段文字,然后启动NormalActivity,这时MainActivity由于系统内存不足被回收掉,过了一会你又点击了Back键回到MainActivity,你会发现刚刚输入的文字全部都没了,因为MainActivity被重新创建了。如果我们的应用出现了这种情况,是会严重影响用户体验的,所以必须要想想办法解决这个问 题。

6.5.1 保存数据在Activity的bundle中

onSaveInstanceState() 方法会携带一个Bundle 类型的参数,Bundle 提供了一系列的方 法用于保存数据,比如可以使用putString() 方法保存字符串,使用putInt() 方法保存整 型数据,以此类推。每个保存方法需要传入两个参数,第一个参数是键,用于后面从Bundle 中取值,第二个参数是真正要保存的内容。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String tempData = "Something you just typed";
    outState.putString("data_key", tempData);
}
6.5.2 从bundle中取出数据

onCreate() 方法其实也有一个Bundle 类型的参数。这个参数在一般情况下都是null ,但是如果在活动被系统回收之前有通过onSaveInstanceState() 方法来保存数据的话, 这个参数就会带有之前所保存的全部数据。

安卓Android ·移动应用开发 创建第一个Android项目 可以选择我们的模拟器,甚至我们可以通过手机屏幕共享的方式,把手机的开发者模式打开等操作,下载到本机手机之中,可以0距离的感受,程序之美。 阅读详情

相关推荐

全面安卓应用开发入门课件

为了实现自定义的手势,安卓提供了类。通过这个类,我们可以检测和识别自定义手势动作,并为其绑定相应的动作。@Override// 处理双击事件});@Override// 转发触摸事件到GestureDetector。

weixin_35826166的博客 736

Android 如何从活动向碎片传递数据

踩了些坑,做个笔记,方便以后看 方法一:利用碎片的setArguments()方法传递bundle 首先,先穿插一个活动间传递数据的方法: 活动间传递数据: // 两种方法 /** *方法一:直接使用intent提供的put方法,如putString、putputExtra之类的 *只适合传递单个数据以及两个活动间 **/ intent.putString("key", "123456"); intent.getString("key"); /** *方法二:bundle(推荐) *把数据封

NULLHao 982

神经网络(十五)在VS Code下搭建PyTorch环境

pytorch在vscode中的配置和使用

就随便写写.... 5万+

android标题栏后退键,使用后退按钮时Android更改标题

我的活动:TextView title;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Overview overview = new Overview();setContentView(R.layout.activity_second);if (save...

weixin_39977776的博客 129

LabVIEW波形图表时间轴设置:三种方法实现横坐标显示日期时间

在数据采集与设备监控场景中,波形图表的横坐标默认显示采样点序号而非日期时间,这给工程师分析历史数据带来不便。理解时间标识(Timestamp)的本质——一个自1904年起算的双精度秒数,是解决问题的关键。时间轴设置既是显示格式问题,更是数据层与显示层的协同设计。通过属性节点动态生成刻度标签、将时间标识数组直接作为X轴数据、或使用波形数据(Waveform)类型绑定t0与dt,分别适用于固定点数显示、非等间隔事件记录和等间隔连续采样等不同需求。合理选择方案并注意缓冲区预分配与时间连续性处理,可让波形图表准确呈

weixin_33416697的博客 253

基因组研究之单倍型T2T基因组(一)

单倍型T2T基因组(Haplotype-resolved T2T genome)是一种高精度、高连续性、高完整性的基因组组装技术,它能够提供从端粒到端粒的完整基因组序列,包括所有的基因和非编码序列。完整覆盖:T2T基因组覆盖从端粒到端粒的染色体序列,包含所有的基因和非编码序列,包括以往难以解析的端粒和着丝粒区域。单倍型解析:单倍型T2T基因组能够区分来自父母本的遗传信息,进行亚基因组不对称演化研究,挖掘单倍型等位基因间的表达差异,这对于重测序、性状定位、进化、基因功能、基因编辑等研究至关重要。

2401_89507557的博客 2438

安卓开发学习, 添加Button元素, 并且在活动中使用Toast和Menu

这里添加了一个 Button元素,并在Button元素的内部增加了几个属性。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:ori

天行健 君子以自强不息,地势坤 君子以厚德载物。 2097

新手必看!Stata工具变量分析中的三大陷阱:如何正确解读LM统计量、CDW检验和Hansen J值

本文深度解析Stata工具变量分析中的三大核心检验:不可识别检验、弱IV检验和过度识别检验,帮助新手避开常见陷阱。详细解读LM统计量、CDW检验和Hansen J值的正确使用方法,提供实战案例和Stata操作指南,确保研究结论的可靠性。

weixin_29231027的博客 572

Android开发——玩转活动

本文介绍几种关于活动的实践技巧。 项目代码继续基于《安卓开发——活动的启动模式》 一、知晓当前在哪个活动 新建一个Java Class:BaseActivity,并让它继承AppCompatActivity,为啥要继承这个可以参考这里或者书的第21页。 接下来重写onCreate(),可以看到通过getClass().getSimpleName()打印了当前实例的类名: public class...

干燥的空气,湿润的呼吸 311

原生H5如何优雅拦截浏览器返回事件:全面屏侧滑退出的解决方案

本文深入探讨了在原生H5中如何优雅地处理浏览器返回事件,特别是针对全面屏手机侧滑返回手势的解决方案。核心是利用HTML5 History API,通过`history.pushState`方法在历史栈中插入记录,并监听`popstate`事件,从而实现在用户侧滑时平滑关闭全屏预览层而非直接退出页面,有效提升了移动端H5应用的原生交互体验。

i0j1k2l3m的博客 269

摩尔线程嵌入式面试题及参考答案(2万字长文)

说一下你对 drm 框架的理解。 DRM(Direct Rendering Manager)是 Linux 系统中用于管理图形显示设备的一个重要框架。 从架构层面来讲,它处于内核空间,主要目的是为用户空间的图形应用程序提供一个统一的接口来访问图形硬件。DRM 包括内核态的驱动模块和用户态的库。内核态的驱动负责和硬件进行交互,比如对显存的管理、硬件寄存器的配置等。用户态的库则方便应用程序利用内核态提供的功能进行图形渲染等操作。 在图形显示的具体流程中,DRM 可以控制显示设备的分辨率、刷

大模型大数据攻城狮的专栏 1229

Android详细开发教程,本文章将带你更深入的学习安卓开发

安卓开发是一项充满挑战和乐趣的技能,它可以让你创建各种类型的移动应用,从简单的工具到复杂的游戏,本文章将为你提供一个详细的学习路线,参考内容,应用场景,实用案例及代码示例,以及一些优秀的GitHub开源项目,帮助你深入掌握安卓开发!

HSX的博客 4719

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 649

Android开发(二)—— 活动

活动(Activity)是最吸引用户的地方,它包含用户界面的组件,主要用于和用户进行交互

hhhhh_555的博客 1535

SAP Event Mesh 简介

Get Started with Messaging for Decoupled Communication Step 1: What is the SAP Event Mesh service? SAP Event Mesh 是一种完全托管的服务,用于连接应用程序、服务和系统,以便它们可以通过消息和事件相互交互。 它通过引入中央消息代理取代了传统的点对点通信。 虽然点对点通信适用于在有限数量的发送方和接收方之间共享数据,但可扩展性很快就会成为一个问题。 SAP Event Mesh 解决了这个问题,并确保

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1243

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android Studio目录结构介绍, 安卓开发入门

安卓学习:Android Studio目录结构 刚刚开始学Android开发, 来分享一下Android Studio 项目的目录结构 这是刚刚创建完项目的样子 任何一个新建的项目都会默认使用Android模式的项目结构, 但这并不是项目最真实的目录结构, 而是被Android Studio转换过来的, 这种项目结构简洁明了,适合进行快速开发,但是对于新手来说可能并不易于理解。 点击图片中Android区域可以切换项目结构模式. 这里我们项目结构切换为Project, 这就是最真实的目录结构 这里开始

天行健 君子以自强不息,地势坤 君子以厚德载物。 5576

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[Android] 2020某宝双十二活动自动化脚本

安卓手机上使用Auto.js软件运行js脚本双十二安装使用流程 双十二   手动肯定比机器自动麻烦,所以找了个脚本 找到大佬的作品,点我 安装使用流程   在Android7.0及以上设备(无需Root)安装Auto.js App 将以下代码保存为.js后缀的文件,如tb1212.js(直接去大佬的GitHub中下载也可以!) /** * 淘宝双十二活动脚本 * * Author: YBQ789 * Date: 2020/12/03 * Versions: 1.2.0 * Github: htt

weixin_45571987的博客 808

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

Android IoT开发实战 | 06 - 使用 Intent 切换活动

1. Intent Intent 是Android中各组件之间进行交互的一种方式,可以指明当前组件想要执行的操作,比如: 启动活动 启动服务 发送广播 2. 使用Intent Intent有非常多的重载构造函数,其中一个是: Intent(Context packageContext, Class cls); 第一个参数需要提供一个启动活动的上下文; 第二个参数需要指定要启动的目标活动; ...

Mculover666的博客(嵌入式) 1118

Android使用Intent为下一个活动提供数据;Android使用Intent返回数据给上一个活动;Android活动的生命周期;返回栈;活动状态;活动的生存期

本文介绍了Android开发中Intent的数据传递机制和活动生命周期管理。主要内容包括:1)通过putExtra()和getStringExtra()等方法在不同活动间传递数据;2)使用startActivityForResult()和onActivityResult()实现活动间的数据回调;3)Android活动生命周期的四种状态(运行、暂停、停止、销毁)和七个关键回调方法(onCreate、onStart等),以及活动的三种生存期(完整、可见、前台)

weixin_72637723的博客 1018

安卓Android入门

Android基于Linux内核,这使得它具有强大的硬件兼容性和稳定性。

m0_74154295的博客 2275

7天入门Android开发之第2天——四大组件之活动

活动(Activity)是 Android 应用程序中的一个重要组件,它代表用户界面上的单个窗口,通常会填充整个屏幕。通过活动,可以创建各种各样的用户界面,并控制界面的行为。活动可以包含各种 UI 元素,例如按钮、文本框、图像等,以及与用户交互的逻辑,比如响应用户的点击、触摸等操作。通过定义不同的活动,可以实现应用程序中的各种功能和界面。

weixin_62370184的博客 935

Android中使用startActivityForResult启动活动

方法用于启动一个新的活动(Activity)并期望在该活动完成后返回结果数据给调用方。方法启动目标活动,并传递一个请求码(requestCode),用于标识这次启动请求。方法设置结果代码(resultCode)和可选的结果数据(Intent),然后调用。方法来处理需要返回结果的交互场景,从而实现更加灵活和交互性强的应用程序设计。并关闭后被调用,可以在该方法中获取返回的结果数据并进行处理。方法关闭目标活动并返回结果给调用方。方法,该方法会在目标活动调用。在Android开发中,在调用方活动中,通过调用。

微赚淘客系统开发者博客 2490

Delphi 开发安卓时判断进入非活动

Java开发安卓时,会使用onResume及onPause处理APP的执行状态,而在使用delphi做安卓开发时,在主窗体的各事件中不能处理这对应的状态切换事件(至少目前我没找到)。 有时候,我们需要在APP暂时处于非活动状态及恢复激活时完成一些工作,为此,需要增加一个事件的响应处理。 引用 FMX.Platform 增加一个事件处理过程: function AppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; 其中的TAp

tanqth的专栏 1万+

安卓学习笔记(二)活动Activity

总结《第一行代码》Android学习笔记(二)活动Activity活动(Activity)Toast的使用Menu的使用销毁活动使用Intent实现活动的转移和数据传递1.使用显式Intent2.使用隐式Intent3.隐式Intent的更多用法4.向下一个活动传递数据5.向上一个活动传递数据活动的生命周期活动的回收后数据丢失问题活动的启动模式1.standard2.singleTop3.sing...

qq_36271550的博客 577

安卓开发—探究活动

勾选Generate Layout File表示会自动为项目创建一个对应的布局文件,勾选Lancher Activity表示会自动将项目设置为当前项目的主活动,Backwards Compatibility表示为项目启用向下兼容模式。它是一种可以包含用户界面的组件,一个应用程序中可以包含零个或多个活动。

Fzw1211的博客 393
上一篇: Android开发初解(一)
下一篇: Android之Drawable简单入门(三)
乐正龙牙lox
博客等级 码龄5年 317粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值