Android 四大组件解析

Android四大组件深度解析:从基础到实践(Kotlin版) 摘要:本文深入解析Android四大组件,重点介绍Activity和Service的实现与应用。Activity部分涵盖生命周期管理、启动模式配置及Kotlin实现示例,包括状态保存和Activity Result API的使用。Service部分区分启动服务与绑定服务,提供前台服务实现代码,演示后台任务执行与通知管理。通过实际Kotlin代码展示组件核心功能,为Android开发提供实用参考。(149字) 阅读详情

本文内容主要来源于网络,参考自文章。

Android四大组件分别是:Activity,Service,BroadcastReceiver,ContentProvider。

  1. Activity(活动):通常表现为一个可视化的用户界面。例如,用户的登录页面以及登录后显示的主页通常都是一个Activity。Activity组件主要负责展示用户界面、处理用户交互以及进行数据传递等。
  2. Service(服务):无界面的后台组件,用于执行长期运行的操作,比如在后台下载软件更新安装包等。
  3. BroadcastReceiver(广播接收器):用于接收广播信息,并做出对应处理的组件。比如电量的变化,更改语言选项等。
  4. ContentProvider(内容提供者):应用程序之间共享数据的桥梁,是管理跨程序应用访问的组件,例如访问相册或文件等。

一、Activity

一个应用程序中有0至多个Activity,0个表示该应用程序不包含与用户交互的界面。每个Activity就是一个独立的界面,从一个页面跳转到另一个页面,通常就是从一个Activity跳转到另一个Activity。

1.1 Activity的生命周期

Activity的生命周期包含多个关键阶段,这些阶段反映了Activity在不同状态下的变化。
从Activity创建到销毁的整个过程, 涵盖了生命周期:onCreate(); onStart(); onResume(); onPause(); onStop(); onDestroy();.

  1. onCreate():在Activity首次创建时调用,用于进行初始化操作,如加载布局,绑定数据等。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
  1. onStart(): 当Activity对用户可见时调用,此时Activity还未处于前台,不能与用户交互。
  2. onResume(): 当Activity进入前台并开始与用户交互时调用,此时Activity处于运行状态。比如页面已完全显示可见,用户可以点击按钮操作。
  3. onPause(): 当Activity失去焦点,但仍有部分可见时调用,常用于存储一些临时数据或停止一些消耗资源的操作。
@Override
protected void onPause() {
    super.onPause();
    // 保存临时数据
}

  1. onStop(): 当Activity完全不可见时调用,此时Activity已停止运行。
  2. onDestory(): 当Activity被销毁之前调用,用于释放资源和清理工作。
@Override
protected void onDestroy() {
    super.onDestroy();
    // 释放资源
}

  1. onRestart():Activity从停止状态重新启动时调用。首页Activity从后台回到前台。
    该图出自 郭霖 《第一行代码(第二版)》

1.2 Activity的启动方法

Activity的启动方法也可以叫做Activity间的跳转,分隐式跳转和显式跳转。在Android中,Activity的启动是通过Intent来表达的,Intent是组件之间通信的媒介,专门提供组件互相调用的相关信息,Intent的启动方式,大致分为两种: 显式启动和隐式启动。

1.2.1 显式启动

明确指定要启动的Activity的class或者包名.activity类名。显示启动提供了三种方式:

  1. Class跳转
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
  1. 包名跳转
Intent intent = new Intent(); 
intent.setClassName(FirstActivity.this,"com.test.launchapplication.SecondActivity");
startActivity(intent);
  1. ComponentName跳转
Intent intent = new Intent()
ComponentName componentName = new ComponentName(FirstActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);

1.2.2 隐式启动

隐式启动是通过指定Intent的Action(动作)、Category(类别)、Data(数据)等信息,让系统根据这些信息来寻找合适的Activity来进行启动。

  1. 在AndroidManifest.xml文件中 定义action和category属性:
<activity android:name=".MainActivity">
	      <intent-filter>
	            <action android:name="android.intent.action.MAIN"/>
	            <category android:name="android.intent.category.LAUNCHER"/>
	      </intent-filter>
</activity>

其中action的name可以自定义,category默认的配置为
<category android:name="android.intent.category.DEFAULT"/>

  1. 在java 文件中写入逻辑代码
Intent intent = new Intent("android.intent.action.MAIN");
startActivity(intent);

1.3 Activity的启动模式

Activity有四种启动模式:standard、singleTop、singleTask、singleInstance.

  1. standard(标准模式):Activity的默认模式,每次启动一个Activity,都会创建一个新的实例并将其压入任务栈中,无论该Activity是否已经存在于任务栈里。这种模式下,多个相同的Activity实例可以同时存在于任务栈中。例如,在一个应用中多次启动同一个Activity,就会有多个该Activity的实例依次入栈。
// 在代码中以standard模式启动Activity
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);

  1. singleTop(栈顶复用模式):如果新启动的Activity已经位于任务栈的栈顶,那么不会创建新的Activity实例,而是直接复用栈顶的实力,并调用其onNewIntent();方法。若该Activity不在栈顶,则会创建新的实例并压入栈中。例如,当应用处于某个Activity界面时,再次启动该Activity,如果它在栈顶,就不会创建新实例。
// 在AndroidManifest.xml中设置Activity为singleTop模式
<activity
    android:name=".TargetActivity"
    android:launchMode="singleTop">
</activity>

  1. singleTask(栈内复用模式):系统会先检查任务栈中是否已经存在该Activity的实例。如果存在,系统会将该Activity实例之上的所有Activity出栈,使该Activity实例处于栈顶,并调用onNewIntent();方法;如果不存在,则创建新的Activity实例并压入栈中。这种模式常用于应用的主界面,确保主界面在任务栈中只有一个实例。
// 在AndroidManifest.xml中设置Activity为singleTask模式
<activity
    android:name=".TargetActivity"
    android:launchMode="singleTask">
</activity>

  1. singleInstande(全局唯一模式):该模式下的Activity会独占一个任务栈,即该Activity在整个系统中只有一个实例,并且该实例当度存在于一个任务栈中。当启动该Activity时,如果该Activity所在的任务栈不存在,则会创建一个新的任务栈,并将该Activity实例放入其中;如果该任务栈已经存在,则直接复用该实例。这种模式适用于需要独立运行且不予其他Activity共享任务栈的场景,如闹钟提醒界面。
// 在AndroidManifest.xml中设置Activity为singleInstance模式
<activity
    android:name=".TargetActivity"
    android:launchMode="singleInstance">
</activity>

二、Service

Service用于在后台执行长时间运行的操作,不提供用户界面。它可以在应用程序的进程中运行,也可以跨进程运行。

2.1 Service生命周期

生命周期常用方法:

  1. onCreate():在Service被创建时调用,主要用于进行一些初始化操作,如初始化变量、注册广播接收器等。例如。在音乐播放Service中,可以在onCreate()方法里初始化音乐播放对象。
  2. onStartCommand():每次通过startService()启动Service时会调用该方法。此方法会接收启动Service时传递的Intent对象,可根据其中的数据来执行相应的操作。比如,在文件下载Service中,可以从Intent中获取要下载的文件URL,然后开始下载任务。
  3. onBind():当有客户端调用bindService()方法绑定Service时调用,该方法需要返回一个IBinder对象,用于与客户端进行通信。例如,在一个提供数据查询服务的Service中,可返回一个实现了IBinder接口的对象,客户端通过该对象调用Service中的方法回去数据。
  4. onDestroy():在Service被销毁时调用,用于释放Service所占用的资源,如关闭数据库连接,停止线程等。比如,在音乐播放Service销毁时,需要停止音乐播放并释放音乐播放器资源。

不同的启动方式会使Service经历不同的生命周期流程。

2.1.1 启动式Service

通过startService()启动,适用于执行一次性任务,如下载文件,播放音乐。
首先会调用onCreate()方法进行初始化,接着调用onStartCommand()方法执行具体的服务操作。当Service不在需要时,可调用stopService()或在Service内部调用stopSelf()来停止Service,此时会调用onDestroy()方法释放资源。
实例代码如下:

// 启动Service
Intent intent = new Intent(this, MyService.class);
startService(intent);

// 停止Service
stopService(intent);

2.1.2 绑定式Service

通过bindService()绑定,提供长期服务,比如后台计算,数据同步。
跟启动式Service一样,首先调用onCreate()方法,然后调用onBind()方法返回IBinder对象。当客户端调用unbindService()解除绑定时,会依次调用onUnbind()和onDestroy()方法。示例代码如下:

// 绑定Service
Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

// 解除绑定
unbindService(serviceConnection);

图片来源于参考文章

三、BroadcastReceiver

在Android系统中用于接收广播消息的组件,其工作原理给予Android的消息传递机制。当系统或应用发出一个广播消息时,Android系统会将这个消息发送给所有注册了相应广播意图的BroadcastReceiver。BroadcastReceiver在接收到广播消息后,会根据其内部定义的逻辑执行相应的操作,且这个过程是异步的,不会阻塞主线程。

3.1 广播的类型

广播分为两种:系统广播和自定义广播。

  1. 系统广播:顾名思义,系统广播是由系统发出,比如电池电量低,网络状态发生变化,屏幕开关等。
  2. 自定义广播:由应用发出,用于应用内部或应用间的通信。比如在APP中定义一个广播,当某个任务完成后发出广播消息,在应用内接收广播消息的逻辑中就会收到该条消息。

3.2 广播的注册方式

BroadcastReceiver的注册方式分为两种:静态注册和动态注册。

  1. 静态注册:在AndroidManifest.xml中注册,即使应用未运行也能接收广播,适用于接收系统广播。
// 注册
<application
    ...
    <receiver
        android:name=".MyBroadcastReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.example.MY_STATIC_BROADCAST" />
        </intent-filter>
    </receiver>
</application>

// 接收
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理接收到的广播
        Toast.makeText(context, "接收到静态广播", Toast.LENGTH_SHORT).show();
    }
}

  1. 动态注册:在代码中通过registerReceiver()注册,常用于应用运行时接收广播。适用于监听应用内部的广播,如用户点击某个按钮后发出的消息。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private BroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建广播接收器实例
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // 处理接收到的广播
                Toast.makeText(context, "接收到广播", Toast.LENGTH_SHORT).show();
            }
        };

        // 创建IntentFilter,指定要接收的广播类型
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.example.MY_CUSTOM_BROADCAST");

        // 注册广播接收器
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销广播接收器
        unregisterReceiver(receiver);
    }
}

四、ContentProvider

主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。
ContentProvider具有以下特点

  1. 数据共享:可实现不同应用程序间的数据共享。
  2. 独立性:创建的ContentProvider是独立类型,与Activity和应用本身无直接关联。
  3. 唯一标识:每个ContentProvider都有一个唯一的authority,用于外部应用与对应ContentProvider数据进行交互,为保证其唯一性,通常将其写成和应用程序一样的包名。
  4. 统一接口:提供了统一的增删查改接口。
  5. 权限控制:可通过自定义权限对ContentProvider的访问进行控制,保证数据安全。

本文主要对Android四大组件做一个概念介绍,具体详解请关注后续内容。
感谢看完全文,比心!

【FPGA】AD9653设计和调试总结 基于FPGA的AD9653设计,设计思路,注意事项 阅读详情

相关推荐

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 467

Android 四大组件全面解析

Activity:主线程 5 秒内未响应输入事件(如点击、触摸);Service:主线程 20 秒内未完成或onBind();方法 10 秒内未执行完毕;:主线程执行query()等操作超过 10 秒(间接导致 ANR)。解决方式:耗时操作放在子线程,避免阻塞主线程。

2401_89387076的博客 1748

【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置

为了达到原理图和PCB两两交互的功能,需要在ORCAD中将允许交互进行勾选,这样才可以,执行菜单命令Options-Preference后,我们打开参数界面,进行选择Miscellaneous菜单,将交互模式进行勾选。在做硬件pcb设计的时候,原理图选中一个元器件,希望可以再PCB中可以直接选中。对于网表必须是导入第一方网表,第三方是无效的。在allegro中使能/关闭交互式布局功能。

weixin_50499137的博客 2075

Android 四大组件全面解析:从基础原理到进阶实战

Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)是应用开发的核心基础。Activity负责用户界面交互,通过生命周期管理实现资源优化;Service处理后台任务;BroadcastReceiver实现跨应用通信;ContentProvider管理数据共享。组件间通过Intent通信,遵循系统调度机制确保稳定性。Activity作为交互核心,需掌握其生命周期、启动模式及跳转方式,并通过性能优化避免内存泄漏和ANR问题。合理使用这些组

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1414

海思Hi3516CV610开发实战:在Ubuntu 22.04上从零构建嵌入式Linux开发环境

本文详细介绍了在Ubuntu 22.04上为海思Hi3516CV610开发板搭建嵌入式Linux开发环境的完整流程。从虚拟机配置、系统安装到基础环境设置,提供了实用技巧和常见问题解决方案,帮助开发者高效构建适用于智能视觉处理的开发环境。

weixin_29197699的博客 508

AIR780E二次开发点灯(LuatOS)

Air780E的LuatOS点灯教程,二次开发教程,可用于所有ec618平台,无需SDK

rootuseres的博客 1万+

安卓四大组件之——BroadcastReceiver广播的详细解析

BroadcastReceiver 身为安卓的四大组件之一,其使用率非常普遍,所以我们要熟练掌握其使用方法。 1,广播的注册方式有两种:静态注册和动态注册 1),静态注册:需要在Androidmanifest 中进行声明,主要用于全局APP中监听,只有完全退出APP才能让其停止工作。 2),动态注册:在代码中注册,不需要在Androidmanifest进行声明,其生命周期随着活

www121104115的博客 596

保姆级教程:用Seurat 5.0.1搞定单细胞测序数据从质控到细胞注释的全流程

本文提供了一份详细的Seurat 5.0.1单细胞测序数据分析教程,涵盖从数据质控到细胞注释的全流程。通过R代码示例和可视化分析,帮助用户掌握单细胞RNA测序数据处理的核心技术,包括数据标准化、降维聚类和细胞类型注释,适用于生物信息学研究和临床数据分析。

weixin_29067143的博客 195

Android四大组件全面解析,夯实基础。

Android四大组件 Android, Poor is the foundation 穷是基础。 Activity 生命周期 与Fragment进行绑定时的生命周期变动 SDK28 模拟器28 进入Activity,绑定Fragment,然后点击返回键之后 进入Activity,绑定Fragment,点击home,然后重新进入,再点击返回 进入Activity,绑定Fragme...

petterp的博客 1012

Python头歌实验题目(2024版)

武汉理工大学头歌平台实验题目

2401_84152595的博客 2万+

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

WW、forever的博客 485

安卓系统架构解析:四大组件与AMS/WMS的协作机制

在安卓开发中,系统服务(如AMS和WMS)与四大组件的协作机制是性能优化的核心。AMS(ActivityManagerService)负责进程管理和任务调度,而WMS(WindowManagerService)则掌控UI渲染和窗口管理。理解这些底层原理,能有效解决ANR、内存泄漏等常见问题。通过分析进程优先级(Adj算法)和窗口层级(TYPE_BASE_APPLICATION),开发者可以优化应用性能。例如,使用foreground service避免后台进程被回收,或通过Systrace工具排查WMS的布

weixin_33282146的博客 278

如何在MacBook上安装部署原生openclaw

本文介绍了在MacBook上安装OpenClaw的详细步骤:首先通过curl或国内镜像源安装nvm和Node.js(版本≥22),然后使用nvm安装Node.js 24并验证安装。接着通过脚本快速安装OpenClaw,完成安装后选择Qwen作为AI模型并进行OAuth认证。配置过程中可跳过联网搜索和Agent技能设置,最后选择Web界面作为呈现方式。安装完成后,系统会启动openclaw-gateway进程并打开Web界面,用户可通过简单的"hello"指令开始与AI对话。目前基础功能已

木简熙的博客 809

Android四大组件深度解析

系统对四大组件的过程进行了很大程度的封装,日常开发中并不需要了解底层的工作原理,那么研究这些原理的意义在哪里呢?如果你想在技术上更进一步,那么了解一些系统的工作原理是十分必要的,也是开发人员日后成长为高级工程师所必备的技术能力。 Android作为一个优秀的基于Linux操作系统,其内部一定有很多值得我们学习的地方,通过对Android操作系统的学习对提高开发人员的内功有很大的好处。 如果你从事

pureSky的博客 3244

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

Android四大组件之Service全面解析(一)

 在阿杰的上一篇博文中给大家讲了一下Android四大组件之一的Activity,也是最重要的,这一篇文章,给大家讲一下Service。 什么是Service  Service是Android的四大组件之一应用广泛,它是一个能在后台进行一个长时间的操作并且不提供用户界面的一个组件,应用相当广泛。其他应用组件可以启动Service,当用户切换到另一个应用程序时,Service依然可以在后台运行。...

ZCJ-阿杰的博客 285

计算机控制技术及应用

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

安卓四大组件面试实战:生命周期、启动模式与后台限制全解析

在Android应用开发中,四大组件——Activity、Service、BroadcastReceiver与ContentProvider——是构建一切应用功能的基石。它们各自承担界面展示、后台执行、事件通知与跨进程数据共享的职责,并通过Intent与Binder机制实现协作。理解它们的生命周期与启动模式,不仅是面试中的高频考点,更直接关系到应用的任务栈管理、内存安全与版本兼容性。随着系统版本演进,后台服务限制、静态广播失效、ContentProvider初始化时机等新问题不断出现,开发者需要从“背概念”

weixin_32239523的博客 301

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android四大组件:BroadcastReceiver史上最全面解析

https://www.jianshu.com/p/ca3d87a4cdf3

majalis_C的博客 167

安卓系统架构解析:四大组件与系统服务交互机制

Android系统架构的核心在于组件化设计与系统服务的协同工作。四大组件(Activity、Service、BroadcastReceiver、ContentProvider)作为应用基础单元,通过Binder机制与系统服务(如AMS、WMS)进行跨进程通信。这种架构设计实现了应用隔离与资源共享的平衡,在保证安全性的同时提升系统性能。理解组件生命周期管理与IPC通信原理,是解决ANR、内存泄漏等常见问题的关键。在工程实践中,开发者需要特别注意Android版本迭代带来的后台限制、存储权限等适配要求,通过Jo

weixin_30512965的博客 226

Android之四大组件解析

Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。 Activity 做一个完整的Android程序,不想用到Activity,真的是比较困难的一件事情,除非是想做绿叶想疯了。因为Activity是Android程序与用户交互的窗口,在我看来,从这个层面的视角来看,Android的Activity特像

RityZhang 地盘 528

Awesome-Android-Interview四大组件深度解析:Activity、Service、Broadcast、ContentProvider

Android四大组件是构建应用的核心基石,理解它们的工作原理和交互方式对于开发高质量应用至关重要。本文基于Awesome-Android-Interview项目,为你深度解析Activity、Service、BroadcastReceiver和ContentProvider这四大组件的核心概念、生命周期和最佳实践,帮助你在面试和实际开发中游刃有余 🚀 ## 一、Activity:用户交互的窗

gitblog_01098的博客 506

Android开发四大组件详细解析【建议收藏】

四大组件 ==== Activity -------- ### 实现步骤 1. 继承 Activity 或其子类,实现以下方法: ``` //第一次创建时回调 protected void onCreate(Bundle savedInstanceState); //启动时回调 protected void onStart(); //再次启动时回调

m0_64365896的博客 212

Android组件必知:四大组件全解析

Android应用的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)必须在AndroidManifest.xml文件中声明,否则系统无法识别和管理。声明方式为在<application>标签内分别使用<activity>、<service>、<receiver>和<provider>标签,并指定类名和相关属性。Manifest文件是应用与系统交互的桥梁,负责组件注册、权限管理和生命周期

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 952

安卓四大组件与系统服务(AMS/WMS)的交互机制解析

Android应用开发中,四大组件(Activity/Service/BroadcastReceiver/ContentProvider)是构建应用的基础单元,其运行机制依赖于系统服务AMS(ActivityManagerService)和WMS(WindowManagerService)的调度管理。通过Binder跨进程通信机制,系统服务实现对组件生命周期的精确控制与窗口视觉管理,这种架构设计既保证了应用沙箱隔离的安全性,又提供了流畅的用户体验。在工程实践中,开发者需要掌握AMS的Activity栈管理策

weixin_29191761的博客 171
上一篇: C#中使用FastReport写报告
下一篇: 使用Hash加密用户密码
HQL_seven
博客等级 码龄6年 64粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HQL_seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值