Android Jetpack组件(一)LifeCycle

Jetpack 之 LifeCycle 组件使用详解 一、LifeCycle 简介 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。 LifeCycle 的出现主要是为了解决: 系统组件的生命周期与普通组件之间的耦合性。 系统组件指:Activity/Fragment、Service 和 Application。 普通组件指:将代码按照功能或者作用封装成 阅读详情

Android Jetpack组件系列文章:
Android Jetpack组件(一)LifeCycle
Android Jetpack组件(二)Navigation
Android Jetpack组件(三)ViewModel
Android Jetpack组件(四)LiveData
Android Jetpack组件(五)Room
Android JetPack组件(六)DataBinding
Android Jetpack组件(七)Paging
Android Jetpack组件(八)WorkManager
Android Jetpack组件(九)DataStore

首语

3月4日,Google重磅发布了 Flutter 2 !作为 Flutter 的重大升级,使用 Flutter 2 开发者可以用相同的代码,把使用 Flutter 开发的应用发布到五个操作系统:iOS,Android,Windows,macOS 和 Linux;以及运行到 Chrome 、 Firefo, Safari 或 Edge等浏览器的 Web 版本上,Flutter 甚至还可以嵌入到 Cars, TVs 和智能家电中。
作为一个Flutter开发者,也马上下载了Flutter 2.0 sdk,并将自己的Flutter项目运行到Chrome上,效果很好,就是代码中有些差别,Web端对图片以及dart的io包不支持等等。具体差异可以去Flutter官网查看。贴一张web端效果图。
Flutter 2

介绍

2017年Google I/O大会上,Google推出了AAC(Android Architecture Components),其中包含了LiveData、ViewModel和Room等专门为架构所设计的组件。AAC也可以被当作Jetpack的前身。在2018年Google I/O大会上,Google在AAC的基础上推出了Jetpack。

Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。
Jetpack主要包含以下四个方面,分别是架构(Architecture)、界面(UI)、行为(Behavior)和基础(Foundation)。

  • Architecture组件可帮助您设计健壮,可测试和可维护的应用程序。
  • Foundation组件提供了跨领域功能,例如向后兼容性,测试和Kotlin语言支持。
  • Ul组件提供了小部件和帮助程序,使应用程序不仅简单易用,而且使用起来令人愉快。
  • Behavior组件可帮助应用与标准的Android服务集成,例如通知,权限,共享和助手。
    其中的Architecture组件是我们关注的重点。下面会对其中的组件进行展开学习。下面的这张图是Jetpack刚发布时候的图,现在Jetpack的组件已经不止图中的这些了。详细组件见Android Jetpack所有库。

Jetpack

优点

  1. 遵循最佳做法
    Android Jetpack 组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。
  2. 消除样板代码
    Android Jetpack 可以管理各种繁琐的Activity(如后台任务、导航和生命周期管理),以便可以专注于打造出色的应用。
  3. 减少不一致
    这些库可在各种 Android 版本和设备中以一致的方式运作,助您降低复杂性。

AndroidX 概览

AndroidX 命名空间中的工件包含 Android Jetpack库。与support库一样,AndroidX命名空间中的库与 Android 平台分开提供,并向后兼容各个 Android 版本。
如果要将项目迁移到AndroidX,在Android Studio的菜单栏中选择Refactor—>Migrate to AndroidX。完成之后,打开gradle.properties文件,可以看到这两行代码:

# 表示是否使用AndroidX
android.useAndroidX=true
# 表示是否将第三方库迁移到AndroidX
android.enableJetifier=true

对于新版本的Android Studio已经默认支持AndroidX了,不需要如上操作。

LifeCycle

我们经常要在页面的onCreate()中对组件初始化,在onPause()中停止组件,在onDestory()中对组件进行回收。这样的工作繁琐且代码难以维护,还会引发内存泄漏。
为此,Google提供了LifeCycle作为解决方案。LifeCycle可以帮助开发者简历可感知生命周期的组件,通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中,从而降低了模块间的耦合性和内存泄漏的可能性,编写出更精简的代码且易于维护。

LifeCycle的原理

Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。
Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:

  • 事件(Event)
    从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到Activity和Fragment中的回调事件。
 public enum Event {

        ON_CREATE,
      
        ON_START,
       
        ON_RESUME,
       
        ON_PAUSE,
       
        ON_STOP,
       
        ON_DESTROY,
        
        ON_ANY
 }
  • 状态(state)
    由 Lifecycle 对象跟踪的组件的当前状态。
public enum State {
      
        DESTROYED,

        INITIALIZED,
        
        CREATED,

        STARTED,

        RESUMED;
//比较此状态是否大于或等于给定状态
public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
}

这些我们都可以从Lifecycle类的源码中能看到,具体说明如下图所示。
LifeCycle
Jetpack给我们提供了两个类:LifeCycleOwner(被观察者)和LifeCycleObserver(观察者)。通过观察者模式实现对页面生命周期的监听。
我们在ComponentActivity的源码中可以看到它实现了LifecycleOwner接口,接口中只有一个getLifeCycle(),LifeCycle正是通过该方法实现观察者模式,源码中已经实现了被观察者实现的那部分。

 public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
        
  private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
  
  @NonNull
  @Override
  public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
  }

我们监听 Atctivity的生命周期时,只需要实现观察者那一部分的代码,即让自定义组件实现LifecycleObserver接口即可。

public class MyObserver implements LifecycleObserver {
	//当Activity执行onResume()时,该自动调用
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
        ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
        ...
    }
}

在Activity中,只需要使用以下代码,将观察者和被观察者绑定起来,不用再担心Activity生命周期变化对组件带来的影响。

getLifecycle().addObserver(new MyObserver());
LifecycleService

Android中除了Activity和Fragment有生命周期外,还有一个重要的组件Service,为了方便对Service生命周期的监听,Android提供了LifecycleService类,该类继承于Service,并实现了LifecycleOwner接口。和Activity和Fragment类似,也有一个getLifecycle()供我们调用,部分源码如下。

public class LifecycleService extends Service implements LifecycleOwner {
    private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher(this);
    
    @Override
    @NonNull
    public Lifecycle getLifecycle() {
        return mDispatcher.getLifecycle();
    }
}

使用LifecycleService时,我们需要添加如下依赖:

implementation "androidx.lifecycle:lifecycle-service:2.3.0"

使用和Activity中的类似,在Service中绑定观察者,在自定义Observer中实现事件的绑定。使用LifecycleService很好的实现了组件与Service之间的解耦,在其内部自行管理生命周期带来的变化。

ProcessLifecycleOwner

具有生命周期的组件除了Activity、Fragment和Service,还有Application。很多时候我们想知道应用程序处于前台还是后台,或者后台回到前台可以得到通知。为此,LifeCycle提供了一个ProcessLifecycleOwner类,方便我们知道整个应用程序的生命周期情况。
使用ProcessLifecycleOwner时,我们需要添加如下依赖:

implementation "androidx.lifecycle:lifecycle-process:2.3.0"

ProcessLifecycleOwner的使用方式和Activity、Fragment和Service类似,其本质都是观察者模式,在Application中绑定观察者,在自定义Observer中绑定事件。
有了ProcessLifecycleOwner,我们可以方便获取到应用生命周期的变化,在其中做一些业务操作,减少了项目代码的耦合性。但需要注意的是:

  1. ProcessLifecyoleowner是针对整个应用程序的监听,与Activity数量无关。
  2. Lifecycle.Event.ON CREATE 只会被调用一次,而Lifecycle.Event.ON_DESTROY 永远不会被调用。
  3. 当应用程序从后台回到前台,或者应用程序被首次打开时,会依次调用Lifecycle.Event.ON_START 和Lifecycle.Event.ON_RESUME。
  4. 当应用程序从前台退到后台(用户按下 Home 键或任务菜单键),会依次调用 Lifecycle.Event.ON PAUSE 和 Lifecycle.Event.ON_ STOP。
ON_STOP 事件

如果 Lifecycle 属于AppCompatActivity或Fragment,那么调用 AppCompatActivity或Fragment的onSaveInstanceState()时,Lifecycle 的状态会更改为 CREATED 并且会分派ON_STOP事件。在FragmentActivity的源码中可以看到。

 markFragmentsCreated();
 mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);

 private void markFragmentsCreated() {
        boolean reiterate;
        do {
            reiterate = markState(getSupportFragmentManager(), Lifecycle.State.CREATED);
        } while (reiterate);
    }

 private static boolean markState(FragmentManager manager, Lifecycle.State state) {
        boolean hadNotMarked = false;
        Collection<Fragment> fragments = manager.getFragments();
        for (Fragment fragment : fragments) {
            if (fragment == null) {
                continue;
            }
            if (fragment.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
                fragment.mLifecycleRegistry.setCurrentState(state);
                hadNotMarked = true;
            }

            if (fragment.getHost() != null) {
                FragmentManager childFragmentManager = fragment.getChildFragmentManager();
                hadNotMarked |= markState(childFragmentManager, state);
            }
        }
        return hadNotMarked;
  }

通过onSaveInstanceState() 保存 Fragment 或AppCompatActivity的状态后,其界面被视为不可变,直到调用ON_START。如果在保存状态后尝试修改界面,很可能会导致应用的导航状态不一致,因此应用在保存状态后运行 FragmentTransaction时,FragmentManager会抛出异常。
AppCompatActivity的onStop() 会在onSaveInstanceState()之后调用,这样就会留下一个缺口,即不允许界面状态发生变化,但 Lifecycle 尚未移至 CREATED 状态。
为防止出现这个问题,beta2 及更低版本中的 Lifecycle 类会将状态标记为CREATED而不分派事件,这样一来,即使未分派事件(直到系统调用onStop()),检查当前状态的代码也会获得实际值。

用例
  1. 位置更新之间切换。
  2. 开始和停止视频缓冲。
  3. 开始和停止网络连接。
  4. 暂停和恢复动画可绘制资源。
Jetpack常用组件-深入理解Lifecycle 摘要: Lifecycle是Android Jetpack的核心组件,用于管理Activity/Fragment的生命周期。通过LifecycleOwner(被观察者)、Lifecycle(状态管理器)和LifecycleObserver(观察者)实现监听机制。观察者通过注解绑定生命周期事件,注册后即可自动回调。实现原理分两种情况:API 29+直接注册ActivityLifecycleCallbacks,低版本通过无界面Fragment监听。LifecycleRegistry统一管理状态同步,确保线程安全 阅读详情

相关推荐

android LifeCycle解耦service 组件

前言: 各位同学大家好,相信各位同学在开发安卓的时候都有用过四大组件之一的service吧 今天我们就通过一个获取gps 定位的小案例来讲一下用 LifeCycle解耦service 组件 需要用到的三方库 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' 具体实现: 创建我们的 MylocationObserver 继承 LifecycleObserver package com.example.lifecycle

xq610928的博客 1613

Android Jetpack架构组件及MVVM架构

Android Jetpack架构组件,大部分程序员还未接触到,本课程紧跟时代,内容始终保持技术先进性,以简洁的代码来解释难懂的理论,程序员们每学完1小节课程就能快速上手,将知识运用到自己的项目中。本课程中介绍的Android Jetpack组件可以只学习其中的一部分就能使用到项目中,也可以全部系统的学习。课程的最后,会用Android Jetpack架构组件搭建一个MVVM架构的Demo,一边写代码一边讲解,以最简洁的程序案例让大家明白如何使用Android Jetpack架构组件搭建项目。

Android Jetpack 从使用到源码深耕【生命周期感知组件Lifecycle从实践到原理】(一)

本文,我们首先一个简单的实际代码例子入手,开始说明lifecycle被引入的背景,进而我们使用lifecycle实现了简单的需求,篇幅所限,lifecycle的自我实现以及源码探索,我们下篇文章继续探索。

itbird的专栏 1199

Android LifecycleService

为了方便我们对Service生命周期的监听,Android提供了一个名为的类,让该类继承自Service,并实现接口。/***/​与Activity/Fragment类似,它也提供了一个名为方法供我们使用。@Override。

fromVillageCoolBoy的博客 1497

ServiceLifecycle:Android Service生命周期

项目视频介绍 # 标题 视频地址 1 服务的生命周期视频1 2 服务的生命周期视频2 3 Android Service全面认识三

【β-Boltzmann探索策略】

𝜀是一个介于0和1之间的参数,用于控制探索和利用的比例。当𝜀较大时,智能体更倾向于探索;当𝜀较小时,智能体更倾向于利用已知信息。

m0_59385870的博客 1084

安卓Jetpack组件系列一之Lifecycle

文章目录前言1.什么是Jetpack?2.Jetpack组件库有哪些?一、Lifecycle简介二、使用步骤总结 前言 1.什么是Jetpack? Jetpack是众多组件的集合,是谷歌推出的一套引领开发规范的架构。 我们看安卓开发者官网,jiepack已经与AndroidStudio、Kotlin同级别的地位上,可见谷歌对其重视程度。 2.Jetpack组件库有哪些? Jetpack组件库目前有八十多种,而且还在持续增加中,不过这里面有些组件可能是我们非常熟悉的,比如Activity、Fragment

金福林的博客 2169

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1841

Android Jetpack(一) Lifecycle 组件原理剖析

本文详解介绍了 Jetpack Lifecycle 的使用以及原理剖析。

Chiclaim 5993

从EXIF到测绘:解码大疆影像元数据的实战应用指南

本文深入解析了大疆无人机影像元数据的实战价值,重点阐述了如何利用EXIF和XMP中的GPS、RTK、姿态角及相机内参等关键信息,提升测绘、三维重建及精准农业等项目的成果精度与效率。通过自动化质检脚本与行业应用场景剖析,指导从业者将元数据从信息转化为生产力,实现从拍照到专业测绘的跨越。

dell8的博客 525

从零开始:如何在STM32上搭建QP框架实现事件驱动开发(附完整代码)

本文详细介绍了如何在STM32嵌入式平台上从零开始搭建QP框架,实现事件驱动开发。通过对比传统前后台系统与RTOS的局限,深入剖析了QP框架基于活动对象和层次式状态机的核心优势,并提供了完整的环境配置、代码移植及一个智能灯光控制器的实战案例,帮助开发者构建清晰、可维护的复杂嵌入式应用。

weixin_29200741的博客 486

Android Jetpack 架构组件之 Lifecycle (一)起源

Lifecycle的存在意义 文章开头先来引入一个 业务案例 这是一个学习英语的App,部分页面支持 划词播放 如何可以优雅得实现这个真实的业务场景呢? 首先需要定义一个全局单例的播放器,播放器有一个方法play(val content: String) object ContentPlayer { fun play(content: String) { //调用系统播放器播放 } fun prepare(context: Context)

qq_43747542的博客 258

Word中 Go to endnote 出现闪退问题解决办法

Word中 Go to endnote 出现闪退问题解决办法

努力努力努力 1万+

Android Jetpack组件学习(一):LifeCycle

前言 Lifecycle是Google推出的用于处理Activity和Fragment的生命周期相关问题的组件,是一种观察者模式的结构。 使用lifeCycle能够在生命周期的拥有者和观察者之间建立一种监听关系,当拥有者的生命周期发生变化时观察者能够及时监听到并作出对应的处理,同时观察者能够非常方便的判断当前拥有者的生命周期是什么。 从上面的描述上看,显然LifeCycle的使用场景是和Activity和Fragment的生命周期相关的业务逻辑。 举例来说,在MVP结构中,Presenter需要感知到Act

cat_is_so_cute的博客 2343

基于Coze平台从零构建AI智能体:以测试用例生成为例的实战指南

在人工智能技术快速发展的今天,大语言模型(LLM)和提示词工程(Prompt Engineering)已成为构建智能应用的核心技术。其原理在于通过自然语言指令引导模型完成特定任务,其技术价值在于极大地降低了AI应用开发的门槛,使非专业开发者也能快速实现想法。这一技术广泛应用于自动化办公、智能客服、内容生成等场景。本文聚焦于字节跳动旗下的Coze平台,该平台通过可视化工作流编排和预置技能,将上述技术封装为易用的工具。文章以“根据产品需求文档(PRD)自动生成测试用例”这一具体场景为例,详细拆解了从需求分析、工

weixin_30617695的博客 337

SMART200如何实现多次调用子程序带定时器功能

1、西门子200PLC的子程序由于很多限制条件,如果希望建立一个可以多次调用的子程序,那么这个子程序里是不能含有定时器指令的,所以我们只能退而求其次了。建议将沿指令(上升沿、下降沿)放在多次调用子程序的外面。 2、可以提供不同的时基,提供不同时间的定时 3、实现秒定时 5、子程序内部: STL代码: 1、时基信号由外部提供、 可以提供不同的时基信号 2、实现循环定时开关 LD #Start:L0....

RXXW_Dor的博客 1万+

Android jetpack架构组件(一)Lifecycle实战与源码解析

什么是Lifecycle组件呢?总的来说,Lifecycle 就是具有生命周期感知能力的组件。简单的理解就是,当Activity/Fragment的生命周期产生变化时,Lifecycle组件会感应相应的生命周期变化,当然我们还可以通过使用Lifecycle组件来在自定义的类中管Activity/fragment的生命周期。 目前,Lifecycle生命周期组件主要由Lifecycle、LifecycleOwner、LifecycleObserver三个对象构成。

大模型学习路线 204

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9633

Android Jetpack之LifeCycle

LifeCycle在其内部管理自己的生命周期,从而解藕页面和组件,降低内存泄露发生的可能性,Activity、Fragment、Service、Application均有LifeCycle支持。现在越来越多的公司招聘要求Jetpack是必会项目,Google也在疯狂的更新Jetpack组件,热度完全不亚于Kotlin!如图所示,Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。

csdn_aiyang的博客 1036

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【背上Jetpack之Lifecycle】万物基于 Lifecycle 默默无闻大用处

系列文章 【背上Jetpack】Jetpack 主要组件的依赖及传递关系 【背上Jetpack】AdroidX下使用Activity和Fragment的变化 【背上Jetpack之Fragment】你真的会用Fragment吗?Fragment常见问题以及androidx下Fragment的使用新姿势 【背上Jetpack之Fragment】从源码角度看 Fragment 生命周期 Androi...

Flywith24 写文章的地方 410

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

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

安卓现代化开发系列——从生命周期到Lifecycle

我们从电脑系统的窗口去理解Activity启动一个程序的时候,程序就会在电脑桌面上创建一个窗口,创建的那一瞬间(通常会很快,可能不需要1秒)就相当于Activity的onCreate()。创建完成后,窗口就可以被用户所看见了,被用户看到的那一瞬间就相当于Activity的onStart()。通常来说,一个新启动的程序会自动获得焦点并可被用户交互,因此onStart()之后,窗口会被置顶到顶层,这一瞬间就相当于Activity的onResume()。

maniuT的博客 486

Jetpack原理剖析第三集(Lifecycle篇)

Android,Jetpck,Lifecycle,原理剖析

qq_42359647的博客 1031

【Android】高级Jetpack架构组件+Jetpack compose强化实战

Jetpack 是一个开发组件工具集,Jetpack Compose 则是一个用于构建原生 Android 界面的新工具包。与安卓传统xml布局相比,Jetpack compose 可以让你用更少的代码实现更多的功能;可以用声明性API直观地完成之前需要在多个 XML 文件中完成地任务;可以与现有的所有代码兼容,适用于大多数常用库;可以凭借对 Android 平台 API 的直接访问和对于 Material Design、深色主题、动画等的内置支持,创建精美的应用…

大模型学习路线 763

从观察者模式的角度分析 Lifecycle-aware components

前言 使用RxJava2有一段时间了,由于没有认真去研究过,一直停留在简单的使用阶段,更准确地说是在Retrofit中配合RxJava2CallAdapter使用RxJava2的强大能力。心血来潮(迫切需要),想了解下RxJava2可能导致的Activity内存泄漏问题。先是看了一下RxLifeCycle,浏览了不少博客,其中有一篇说到,RxLifeCycle的作者已经不推荐使用这个项目了,而推荐...

half_bottle的博客 493

Android 如何判断 手机黑屏? 如何判断 手机APP在后台运行?

Android 判断 手机黑屏, 判断 手机APP在后台运行

to44mm的专栏 840

Android Jetpack架构组件:一文带你了解Lifecycle(使用篇)

前言 这一篇文章来介绍Android Jetpack架构组件的Lifecycle,Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期,由于Lifecycle是LiveData和ViewModel的基础,所以需要先学习它。 1.为什么需要Lifecycle 在应用开发中,处理Activity或者Fragment组件的生命周期相关代码是必不可免的, 官方文档中举了一个例...

weixin_45258969的博客 786
上一篇: Android组件化架构
下一篇: Android Jetpack组件(二)Navigation
八归少年
八归少年 新星创作者: 操作系统技术领域 新星创作者: 操作系统技术领域
博客等级 码龄9年 9011粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

八归少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值