BroadCastReceiver 简介

在BroadCastReceiver的onReceive方法中执行耗时操作的正确姿势 经常听说在onReceive中执行耗时操作要开个Service,不要用子线程。   原因嘛,BroadCastReceiver只在onReceive方法执行时是激活状态,只要onReceive一返回,它即为失活状态。Receiver进程是被一个激活状态的BroadCastReceiver所保护而不被系统终止的,一旦onReceive返回,Receiver进程变为一个空进程,空进程是可以在任意 阅读详情

BroadCastReceiver 简介 

BroadCastReceiver 源码位于: framework/base/core/java/android.content.BroadcastReceiver.java

 

广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadcast()、 Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。

 

广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;

 

来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。

 BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等。

BroadCastReceiver 的机制

1. 机制

在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。如图:


 

2. 实现

用接收短信举例:

 

第一种方式 :

实现

public class MyBroadcastReceiver extends BroadcastReceiver {

 

    // action 名称

    String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;

 

    public void onReceive(Context context, Intent intent) {

 

       if (intent.getAction().equals( SMS_RECEIVED )) {

           // 相关处理 : 地域变换、电量不足、来电来信;

       }

    }

}

系统注册:在 AndroidManifest.xml 中注册

< receiver android:name = ".MyBroadcastReceiver" >

           < intent-filter android:priority = "1000" >

             

< action android:name = " android.provider.Telephony.SMS_RECEIVED" />

           </ intent-filter >

       </ receiver > 当然了需要权限 :

 

< uses-permission android:name = "android.permission.RECEIVE_SMS" />

< uses-permission android:name = "android.permission.SEND_SMS" />

 

 

第二种方式:

 

// 广播接收者 - 广播的接收

private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

 

       @Override

       public void onReceive(Context context, Intent intent) {

           // 相关处理,如收短信,监听电量变化信息

       }

 

    };

 

代码中注册:

IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );

registerReceiver( mBatteryInfoReceiver , intentFilter);

 

3. 生命周期

 

描述了 Android 中广播的生命周期,其次它并不像 Activity 一样复杂,运行原理很简单如下图:


 

 

生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。

 

每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁. 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在

BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No

Response) 的对话框 . 。(如图):

 

怎么用好 BroadcastReceiver ?

如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决, 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束

BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的

所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 .

 

广播类型及广播的收发

广播类型

普通广播 (Normal broadcasts)

  发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。

异步广播 , 当处理完之后的Intent ,依然存在,这时候registerReceiver(BroadcastReceiver, IntentFilter) 还能收到他的值,直到你把它去掉 , 不能将处理结果传给下一个接收者 , 无法终止广播 .

 

有序广播 (Ordered broadcasts)

按照接收者的优先级顺序接收广播 , 优先级别在 intent-filter 中的 priority 中声明 ,-1000 到

1000 之间 , 值越大 , 优先级越高 . 可以终止广播意图的继续传播 . 接收者可以篡改内容 .

 

 

 

广播的收发

该组件接收被广播的 intent,Context 可以通过 sendBroadcast() 和 sendOrderedBroadcast()

方法实现广播的发送 .

首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息 ( 如 Action 、 Category) 装入一个 Intent 对象,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把 Intent 对象以广播方式发送出去。

 

使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法

普通广播的发送和接收:

sendBroadcast(intent);

 

Intent intent = new Intent( "cn.lenovo.yangguangf " );

        sendBroadcast(intent);

priority :这个是 AndroidManifest.xml 中 intent-filter 的参数。

 

< receiver android:name = ".MyBroadcastReceiver" >

           < intent-filter android:priority = "1000" >

             

< action android:name = "cn.lenovo.yangguangfu" />

</ intent-filter >

</ receiver >

 

sendOrderedBroadcast(intent, receiverPermission);

 

1 ,他决定该广播的级别,级别数值是在 -1000 到 1000 之间 , 值越大 , 优先级越高;

 

2 ,同级别接收是先后是随机的;级别低的收到广播;

3 ,在 android 系统中只要监听该广播的接收者,都能够收到 sendBroadcast(intent) 发出的广播 ;

 

3 ,不能截断广播的继续传播,

 

4 ,实验现象,在这个方法发来的广播中,代码注册方式中,收到的广播的先后和注明优先级最高的他们的先后是随机。如果都没有优先级,代码注册收到为最先。

 

 

 

   

有序广播的发送和接收:

sendOrderedBroadcast(intent, receiverPermission);

sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

       scheduler, initialCode, initialData, initialExtras)

意图,广播,所有匹配的这一意图将接收机接收广播。

receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。 
resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。 
调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。 
initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;
initialData 一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;
initialExtras 一种结果额外的初始值。通常情况下为空 , 是 Bundle;

 

intent The Intent to broadcast; all receivers matching this Intent will receive the broadcast.

receiverPermission String naming a permissions that a receiver must hold in order to receive your broadcast. If null, no permission is required.

resultReceiver Your own BroadcastReceiver to treat as the final receiver of the broadcast.

scheduler A custom Handler with which to schedule the resultReceiver callback; if null it will be scheduled in the Context's main thread.

initialCode An initial value for the result code. Often Activity.RESULT_OK.

initialData An initial value for the result data. Often null.

initialExtras An initial value for the result extras. Often null.

 

 

 

1,  该广播的级别有级别之分,级别数值是在 -1000 到 1000 之间 , 值越大 , 优先级越高;

2,  同级别接收是先后是随机的,再到级别低的收到广播;

3,  同级别接收是先后是随机的,如果先接收到的把广播截断了,同级别的例外的接收者是无法收到该广播的。(abortBroadcast() )

 

4 ,能截断广播的继续传播,高级别的广播收到该广播后,可以决定把该钟广播是否截断掉。

5 ,实验现象,在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。

 

 

异步广播的发送和接收:

sendStickyBroadcast(intent);

当处理完之后的Intent ,依然存在,直到你把它去掉。

发这个广播需要权限<uses-permission android:name="android.permission.BROADCAST_STICKY" />

去掉是用这个方法removeStickyBroadcast(intent); 但别忘了在执行这个方法的应用里面 AndroidManifest.xml 同样要加上面的权限;

 

 

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

       initialCode, initialData, initialExtras)

这个方法具有有序广播的特性也有异步广播的特性;

 


发送这个广播要: <uses-permission android:name="android.permission.BROADCAST_STICKY" /> 这个权限。才能使用这个方法。如果您并不拥有该权限,将抛出 SecurityException 的。

 

实验现象( sendStickyOrderedBroadcast ()中),在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。

 

广播注册与注销

代码中注册广播:

注册广播方法一: registerReceiver(BroadcastReceiver receiver, IntentFilter filter) ,第一个参数是我们要处理广播的 BroadcastReceiver (广播接收者,可以是系统的,也可以是自定义的);第二个参数是意图过滤器。

 

注册广播方法二: registerReceiver(receiver, filter, broadcastPermission, scheduler) ,第一个参数是 BroadcastReceiver(广播接收者,可以是系统的,也可以是自定义的);第二个参数是意图过滤器;第三个参数是广播权限;第四个参数是 Hander ;

 

注意:权限重复现象,如果功能清单文件里注册了权限,在该方法再注册,则 receiver 无法收到广播,如果 功能清单文件里没有注册了权限,该方法注册也无法收到。当该方法没有注册权限,功能清单里注册的时候, receiver 能收到广播。

 

 

总结:在 Activity 中代码注册广播建议在: onResume() 中注册;

 

思维拓展: 1 ,如果在代码调用 registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 十次( receiver ,filter 的参数是同一参数),那么是否当该广播发送来的时候会收到十次呢?

 

       2 ,注销是否也要注销十次才能把广播全部注销呢?

 

系统中注册广播:(在 AndroidManifest.xml 中 )

< receiver android:name = ".MyBroadcastReceiver" >

           < intent-filter android:priority = "900" >

             

              < action android:name = "cn.lenovo.yangguangfu" />

           </ intent-filter >

</ receiver >

 

有时候还要根据发送广播是否指定权限,来决定是否要权限;

 

广播注销

 

// 代码中注销广播

/unregisterReceiver(mBatteryInfoReceiver);

 

 

 

在 Activity 中代码注销广播建议在: onPuase() 中注销;

不要这这里面注销 Activity.onSaveInstanceState(), 因为这个方法是保存 Intent 状态的。

 

 

 

 

 

 

BroadCastReceiver 的 API

abortBroadcast ():

这个方法可以截获由 sendOrderedBroadcast () 发送来的 广播,让其它广播接收者无法收到这个广播。

clearAbortBroadcast ()

这个方法是针对上面的 abortBroadcast() 方法的,用于取消截获广播。这样它的下一级广播接收者就能够收到该广播了。

getAbortBroadcast ()

这个方法作用是:判断是否调用了 abortBroadcast (),如果先调用 abortBroadcast (),接着再调用getAbortBroadcast (),将返回 true; 如果在调用 abortBroadcast() 、 clearAbortBroadcast ()

getAbortBroadcast (),将返回 false;

 

public final boolean getDebugUnregister ()

Since: API Level 1

Return the last value given to setDebugUnregister(boolean) .

 

 

getResultCode ()

如果用下面四个方法发送得广播,返回码为: -1 ;

// sendBroadcast(intent);

// sendBroadcast(intent, receiverPermission);

// sendOrderedBroadcast(intent, receiverPermission);

// sendStickyBroadcast(intent);

如果用下面两个方法发送得广播,返回码为:根据你设置 initialCode 的数字是多少就是多少;

// sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

// initialCode, initialData, initialExtras)

// sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

// scheduler, initialCode, initialData, initialExtras)

 

 

getResultData ()

得到发送广播时设置的 initialData 的数据;

 

 

getResultExtras (boolean makeMap)

If true then a new empty Map will be made for you if the current Map is null; if false you should be prepared to receive a null Map.

得到由

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

// initialCode, initialData, initialExtras) ;

 

// sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

// scheduler, initialCode, initialData, initialExtras)

中 initialExtras 传入的参数。

实验:我用上面两个方法发了 initialExtras (这个一个 Bundle )传入的参数时,只要不为空,那么 makeMap 是否为 true 和 false 都能够得到数据。

 

isInitialStickyBroadcast ()

Returns true if the receiver is currently processing the initial value of a sticky broadcast -- that is, the value that was last broadcast and is currently held in the sticky cache, so this is not directly the result of a broadcast right now.

 

如果广播接收者是目前处理的一个宿主的广播的初始值,将返回 true , - 也就是说,这个值是最后的广播出的值,目前正在举行的宿主缓存,所以这并不是直接导致了现在的广播。

 

实验:在第三个应用中调用这个方法,无论你用哪种方式发送广播,这个方法得到的总是 false ;在发送广播 的resultReceiver 广播接收者里面调用,得到的也是 false ;

 

 

isOrderedBroadcast ()

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

  initialCode, initialData, initialExtras)

上面这个方法发送时,得到的是 true;

判断是否是有序广播;

 

 

onReceive (Context context, Intent intent)

 

public IBinder peekService (Context myContext, Intent service)

Provide a binder to an already-running service. This method is synchronous and will not start the target service if it is not present, so it is safe to call from onReceive.

 

Parameters:

myContext The Context that had been passed to onReceive(Context, Intent)

service The Intent indicating the service you wish to use. See Context.startService(Intent) for more information.

setDebugUnregister (boolean debug)

Control inclusion of debugging help for mismatched calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) Context.registerReceiver()}. If called with true, before given to registerReceiver(), then the callstack of the following Context.unregisterReceiver()call is retained, to be printed if a later incorrect unregister call is made. Note that doing this requires retaining information about the BroadcastReceiver for

EEGnet模型论文讲解(画图详解三种卷积层操作) 我录了一个讲解视频:https://www.bilibili.com/video/BV1si4y1s7g7/ 目录 一、整体介绍 二、梳理激活函数 三、图解三种卷积层 (核心内容) 四、总结 一、整体介绍 EEGnet是为专门一般的脑电图识别任务而设计的通用且紧凑的卷积神经网络。(设计思路借鉴了MobileNet) 下图是EEGnet的整体结构图,只有三个卷积模块,重点是depthwise conv 和separable conv这两个卷积模块。 表格表明了EEGnet的... 阅读详情

相关推荐

华为昇腾 Atlas 200I DK A2 开发板编程接口学习入门:系统安装和开发步骤、注意事项与典型案例实战

华为昇腾开发板编程接口指南:从入门到进阶 本文系统介绍了华为昇腾开发板的编程接口体系,涵盖MindXSDK和AscendCL两大核心框架。MindXSDK提供高层封装接口,适合快速搭建视觉应用;AscendCL则是底层接口,需手动管理设备内存。文章详细讲解了: 开发环境搭建步骤,包括系统配置、依赖安装 MindXSDK组件化编程流程(图像分类实例) AscendCL底层开发方法(内存管理、模型推理) 常见问题解决方案和调试技巧 两个典型应用实例(摄像头目标检测和图像分类) 针对小白开发者,推荐从MindXS

bother3000的博客 2424

Android 中的BroadCastReceiver

Android 中的BroadCastReceiver                                                 作者:阿福       BroadCastReceiver 简介 (末尾有源码) BroadCastReceiver 源码位于: framework/base/core/java/a...

iteye_16050的博客 203

Windows 11最新WDK安装避坑指南:从Visual Studio配置到KMDF驱动开发

本文提供了在Windows 11系统上进行KMDF驱动开发的完整环境搭建与实战指南。针对最新WDK与Visual Studio的配置变化,详细解析了从独立安装WDK/SDK、创建首个KMDF驱动项目,到编译排错、部署调试的全流程,帮助开发者高效避坑,顺利开启Windows内核开发。

weixin_29302047的博客 526

广播onReceive()方法的context类型探究

1. 铺垫 1). 非Activity类型的context并没有所谓的任务栈; 2). 出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只...

lyl0530的博客 1万+

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

非模式物种PySCENIC分析流程

外的物种想要做scenic分析的话, 可以使用同源基因转换后再进行分析, 将要分析的物种的gene Symbol转换为人、小鼠或者是果蝇的gene Symbol后进行分析。odiscus sinensis(中华鳖)的基因-细胞的矩阵,进行pyscenic分析的话,可参考以下示例。目前pyscenic分析支持的物种仅为人、小鼠和果蝇,其他物种暂时还没有相应的数据库,因。本教程基于Linux及服务。SCENIC转录因子分析。器中的Rstudio环境。例如我们有一个Pel。

weixin_47195452的博客 933

android 广播 onreceive能干什么,Android 广播总结

BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存...

weixin_36277690的博客 2006

GEE:基于自定义的年度时序数据集进行LandTrendr变化检测

本文介绍了使用年度时序数据进行LandTrendr变化检测的方法,包括核心函数调用、参数设置和结果可视化。通过筛选参数(年份、变化幅度和持续时间)对结果进行过滤,输出变化年份、变化幅度和持续时间。代码提供了完整的处理流程,包括数据输入、LandTrendr算法运行、结果筛选与可视化,并支持结果导出。适用于基于Google Earth Engine平台的地表变化检测分析。

养乐多的博客 752

不要在广播的onReceive()方法中执行耗时操作

不要在onReceive()方法中添加过多的逻辑或执行耗时操作,因为onReceive()方法运行在主线程中,耗时操作会导致ANR。 同时,广播接收器中不允许开启子线程: 对于静态注册的广播接收器来说,广播接收器对象的生命周期较短,执行完onReceive()方法就会变为垃圾对象而被回收,在子线程执行完之前,若对应的Activity退出,他们所在进程就变成了空进程(没有任何活动组件的进程),系...

lyl0530的博客 4455

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3402

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7745

BroadCastReceiver简介

NJU phd 在读。 551

智能体开发套件(ADK)介绍

city } ---") city_normalized = city . lower() . replace(" " , "") # 模拟天气数据库 mock_weather_db = {

lpfasd123的博客 1401

BroadcastReceiver 简介

BroadcastReceiver(广播接收器)是Android系统的四大组件之一,这种组件本质上就是一个全局监听器,用于监听系统全局的广播消息。由于BroadcastReceiver是一个全局监听器,因此它可以非常方便地实现系统中不同组件之间的通信。

weixin_50995731的博客 707

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android的BroadcastReceiver简介

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 1、概念:BroadcastReceiver也是Android的四大组件之一,它本质上是一个全局的监听器,用于监听系统全局的广播消息,实现系统中不同组件之间的通信。只要存在与之匹配的Intent被广播出来,Broa...

孤云博客 1605

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android BroadcastReceiver 简介

http://kevin2562.iteye.com/blog/686787 Android BroadcastReceiver 简介 在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver     活动(Activity) - 用于表现功能      服务(Service) - 相当于后台运行的 Activity

heyustudent的专栏 598

计算机控制技术及应用

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

BroadcastReceiver简介

[size=large][color=blue]BroadcastReceiver[/color]作为四大组件之一,觉得跟Activity最大的区别是不怎么跟用户交互,跟Service最大区别是可以广播,将信息发送给诸多用户。 BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。 在Android系统中,广播体现在方方面面,例如当开机完...

不懂事的小屁孩 239

BroadcastReceiver的使用简介

尽量用代码进行BroadcastReceiver的注册,因为在用完之后方便关闭注册。 在AndroidManifest中进行注册后,不管改应用程序是否处于活动状态,都会进行监听,比如某个程序时监听 内存 的使用情况。所以关闭无必要的监听可以使程序更好。 首先声明:private QueryStationsResultReceiver mQueryStationsResultReceiver;//自

Charles Ren's Tech Blog 795

Android BroadcastReceiver简介

1. BroadcastReceiver类 BroadcastReceiver用来接收广播,并在onReceive(Context, Intent)方法里面处理广播。 public class DemoBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context cont...

假装你是大灰狼的专栏 647

广播-BroadcastReceiver简介

广播机制的总结 广播发送者 可发送一种或多种广播 不关心是谁接收 具有实时性 广播接收者 可接收一种或多种广播 不关心是谁发送 具有实时性 BroadcastReceiver简介 BroadcastReceiver组件本质上是一种全局的监听器,因此它的主要作用是实现系统间不同组件之间的通讯。 例如: 通过startService启动的服务如何返回状态给Activity。 Android手机中有很多应用采用广播机制: 电话的接听和拨打 短信的接收和发送 电池的状态 系统的闹

qq_43573997的博客 462
上一篇: Android Activity 之 startActivityForResult用法详解
下一篇: Android中判断网络连接是否可用及监控网络状态
ProbuINg
博客等级 码龄14年 10粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值