Android之 Activity间通信总结

Android Activity间的通信 1 Bundle传值 例如:A调用并将数据传给B 1、A中调用代码: Intent intent = new Intent(); intent.setClass(A.this, B.class); Bundle mBundle = new Bundle(); mBundle.putString("passData", "hello!B");//压入数据,passData是自定义的识别标志,还可以put添加多个Int、String等类型的数据 intent.putExtras(mBundle); 阅读详情

在Android中,Activity作为界面显示。google并不推荐在Activity中做耗时操作,如果Activity操作耗时超过5s时,会提示是否等待对话框。
一般耗时操作会在Service中处理,Service主要负责长期在后台运行。
自从google推出Fragment以来,中文翻译为碎片,使用的越来越广泛。在同一个Activity界面会插入几个Fragment,用来显示不同的功能界面。
在我们的实际项目中,总是会用到Activity、Service及Fragment。Activity与它们之间是怎么进行通信,完成UI更新。接下来,我们一一道来。
一、Activity与Activity之间的通信
当A Activity打开B Activity时,大家都知道通过调用startActivity(intent),由A启动B。如果希望A传递信息给B,只需如果在intent携带即可。如果携带的信息中包含自定义类,需要将类序列化,实现接口Parcelable或者Serializable。
A启动B:

<span style="font-size:14px;">        Intent intent = new Intent(this, AtySecond_.class);
        // 设置启动Activity时携带的参数信息 的Intent
        Bundle bundle = new Bundle();
        bundle.putString("AtySecond", "AtyCommActivity传递的消息,不需要返回值");

        intent.putExtras(bundle);

        startActivity(intent);</span>
B中获取A传递的信息:

<span style="font-size:14px;">	// 获取出入的Budle
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();

        msg = bundle.getString("AtySecond", "");</span>
这种方法,大家都很熟悉,如果在关闭B Activity时,A希望从B中获取操作结果,该如何做呢?在A启动B时只能使用另外一种启动方法——startActivityForResult。startActivityForResult(Intent intent,int requestCode,)的主要作用就是它可以回传数据,其中参数intent,就是启动Activity的意图,参数requestCode是启动Activity,获取返回值的请求码,在onActivityResult作返回值处理时使用,以便分别是哪一个返回值请求。
1.A在启动B时,再使用startActivity()而是使用startActivityForResult

<span style="font-size:14px;">	// 设置启动Activity时携带的参数信息 的Intent
        Intent intent = new Intent(this, AtySecond_.class);
        Bundle bundle = new Bundle();
        bundle.putString("AtySecond", "AtyCommActivity传递的消息,需要返回值");

        intent.putExtras(bundle);

        // 参数 REQUEST_ONE :请求依据,作为在onActivityResult做处理时识别码
        startActivityForResult(intent, REQUEST_ONE);</span>
2.重写onActivityResult,来获取从BActivity返回的数据
<span style="font-size:14px;">	    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
			super.onActivityResult(requestCode, resultCode, data);

			Log.i("123", "requestCode: " + requestCode);

			if (requestCode == REQUEST_ONE) {
				if (null != data) { // data为AtySecond返回的Intent
					// msg即为回传的值
					String msg = data.getStringExtra("AtySecond");
					tv_msg.setText("返回的信息:" + msg);
				}
			}
		}</span>
3.在B Activity finish()之前,将传回数据时,使用setResult方法

<span style="font-size:14px;">	    // 携带返回值得Intent
        Intent intent = new Intent();

        intent.putExtra("AtySecond", "AtySecond返回值");

        setResult(RESULT_OK, intent);
        //此处一定要调用finish()方法
        this.finish();</span>
setResult方法什么时候调用。刚开始使用setResult,Result并 没有返回回去,获取的Intent是null.查阅了半天资料,才发现只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理。也就是说,setResult方法要在finish()之前调用,才能将数据返回。
按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,同时设置intent为NULL并没有调用setResult()也就不会返回任何数据了.解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish().

<span style="font-size:14px;">    public void onBackPressed() {
        // 携带返回值得Intent
        Intent intent = new Intent();

        intent.putExtra("AtySecond", "AtySecond返回值");

        setResult(RESULT_OK, intent);
        //此处一定要调用finish()方法
        super.onBackPressed();
    }</span>
二、Activity与Fragment之间的通信
使用Fragment可以完成在同一Activity完成不同界面的转换。在界面转换时,Activity与Fragment之间的通信成了重中之重。Activity与Frament之间有以下通信方式:
1、如果Activity中有Fragment实例,可以通过直接调用Fragment中的public方法
在Activity中

<span style="font-size:14px;">	FrmFirst mFrmFirst = new FrmFirst();
	tv_frmShow.setText("Frm的信息:" + mFrmFirst.getInfo());</span>
在Fragment中
<span style="font-size:14px;">	public class FrmFirst extends Fragment {

		TextView tv_xl;

		public FrmFirst() {
			// Required empty public constructor
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
								 Bundle savedInstanceState) {
			View view = inflater.inflate(R.layout.frm_first, container, false);
			tv_xl = (TextView) view.findViewById(R.id.tv_xl);
			return view;
		}
		// 权限修饰为public,以供外部调用
		public String getInfo() {
			return tv_xl.getText().toString();
		}

	}</span>
2、如果Activity中没有Fragment实例,每个Fragment都有唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行1中的操作;
	// 获取Fragment ,调用Fragment中的Public方法,与Fragment通信
	Fragment mFrm = mFManager.findFragmentByTag("fragmentTag");
	if (mFrm instanceof FrmFirst) {
		FrmFirst f = (FrmFirst) mFrm;
		tv_frmShow.setText("Frm的信息:" + f.getInfo());
	} else {
		tv_frmShow.setText("Frm的信息:");
	}
3.在Fragment中获取Actvity实例,然后进行操作
在Fragment中
AtyFrms mAtyFrms;
在onAttach中获取Activity实例

<span style="font-size:14px;">	// 绑定当前Activity
    // 可以调用当前Activity中的public 方法
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        mAtyFrms = (AtyFrms) activity;
    }
	
	// 通过getActivity获取Activity实例
    public void onResume() {
        super.onResume();
        // 通过getActivity方法获取当前Activity
        // 调用Activity中的public方法
        AtyFrms atyFrms = (AtyFrms) getActivity();
		// setInfo为Activity的public方法
        atyFrms.setInfo("当前界面为QQ");

    }</span>
4.如果Activity向Fragment传递参数,在Activity通过setArguments传递,在Fragment通过getArguments获取
官方文档推荐,在每个Frament里必须有一个空的构造函数,以便其可以实例化,但是不推荐含有带参的构造方法,用来传递参数,因为这些构造函数,并不能在调用Fragment时,将Fragment重新实例化,如果需要传递参数,可以通过setArguments传递,在Fragment通过getArguments。
在Activity中
<span style="font-size:14px;">	Bundle bundle = new Bundle();
	bundle.putString("FrmFoure", "AtyFrms打开FrmFoure");
	if (null == mFrmFoure) {
		mFrmFoure = new FrmFoure_();
	}
	mFrmFoure.setArguments(bundle);
	mFTransaction.replace(R.id.fl_content, mFrmFoure, "fragmentTag");
	mFTransaction.commit();
	在Fragment中
	// 获取传递的参数 Bundle
	Bundle bundle = getArguments();
	String info = bundle.getString("FrmFoure", "未传递参数信息");</span>
info即为Activity传递的参数
5.通过回调听信。在Activity中实现接口,在Fragment中回调接口
在Activity中

<span style="font-size:14px;">	public class AtyFrms extends AppCompatActivity implements FrmThree.FrmChanedListener{
		***...
		
		 public void setCururent(String str) {
			tv_frmShow.setText("Frm的信息:" + str);
		}
		
		***...
	}</span>
在Fragment中,定义接口
<span style="font-size:14px;">    // 定义接口
    //  持有它的Activity必须实现这个回调方法
    public interface FrmChanedListener {
        void setCururent(String str);
    }
    //获取接口实例
    FrmChanedListener mListener;
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // 如果Activity没有实现这个接口,那么Fragment会抛出ClassCastException异常
        // 如果成功,那么mListener成员就会拥有Activity实现的FrmChanedListener对象的引用,
        // 以便Fragment FrmThree能够通过FrmChanedListener接口定义的回调方法和Activity共享事件
        try {
            mListener = (FrmChanedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    //回调接口
    public void onResume() {
        super.onResume();
        // Fragment FrmThree能够通过FrmChanedListener接口定义的回调方法和Activity共享事件
        mListener.setCururent("微信页面使用回调通信");
    }</span>
6.通过广播通信。在Activity中注册广播并在onReive中对相应广播处理,在Fragment中发送广播。
广播实例见Service通信。
三、Activity与Service之间通信
Activity启动服务Service时,通过Intent启动。若Activity向Service传递参数可以通过Intent传递。而当Service某些操作更新UI时,我们该如何操作呢?启动Service又有startService和bindService两种方式,不同的启动方式又该如何通信?以下有几种通信方式:
1.在Activity中,通过bindService方式启动Service,获取Service实例,然后进行操作
在Activity中
<span style="font-size:14px;">	ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                MyService.MyBinder mMyBinder = (MyService.MyBinder) service;
				// 获取Service对象
                mMyService =  mMyBinder.getService();
            }
	}
	// 通过bindService绑定Service
	Intent intentBind = new Intent(this, MyService_.class);
        bindService(intentBind, conn, BIND_AUTO_CREATE);</span>
在Service中
<span style="font-size:14px;">	public IBinder onBind(Intent intent) {
		
        return new MyBinder();
    }
	// 创建内部类MyBinder继承于Binder,以便获取Service实例
    public class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }</span>
2.通过回调的方式。如方法1,已经获取Service实例。在Actvity中实现接口,在Service中,设置接口实例
并调用。
在Activity中
<span style="font-size:14px;">	ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                MyService.MyBinder mMyBinder = (MyService.MyBinder) service;
                mMyService =  mMyBinder.getService();

				// 通过匿名内部类实例化接口
                mMyService.setListener(new MyService.onProgressChangedListener() {
                    @Override
                    public void setProgress(int progress) {
                        
                    }
                });
            }</span>
在Service中
<span style="font-size:14px;">	public class MyService extends Service {
		
		***...

		onProgressChangedListener mListener;
		
		// 定义接口
		public interface onProgressChangedListener {
			void setProgress(int progress);
		}

		***...
		// 获取接口实例
		public void setListener(onProgressChangedListener listener) {
			this.mListener = listener;
		}

		***...
	}</span>
3.通过广播BroadcastReiceive通信。
通过starService启动Service时,并不能够获取Service,意味着方式1和2,都不可再实现。我们可以这样做,在Service需要更新UI时,发送一条广播。在Activity中注册广播并接受广播处理。此种方式,只需要发送广播,并不需要获取Service实例,那么问题迎刃而解。
在Activity中
<span style="font-size:14px;">	public class AtyService extends AppCompatActivity {
		
		***...

		MyBroadcastReceive mReiver;
		protected void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.activity_aty_service);
			// 动态注册广播
			mReiver = new MyBroadcastReceive();
			IntentFilter filter = new IntentFilter("***");
			registerReceiver(mReiver, filter);
		}
		
		protected void onDestroy() {
			super.onDestroy();
			// 在Activity销毁时,将广播注销
			unregisterReceiver(mReiver);
		}
		
		***...
		public class MyBroadcastReceive extends BroadcastReceiver {

			@Override
			public void onReceive(Context context, Intent intent) {
				***
			}
		}
		***...
	}</span>
在Service中
<span style="font-size:14px;"><span style="white-space:pre">	</span>// 需要更新UI时,发送一条广播
	Intent intentBroad = new Intent("***");
	intentBroad.putExtra("PROGRESS", pro);
	sendBroadcast(intentBroad);</span>
在stopService或unBindService时,需要调用unregisterReceiver,将广播注销掉。

一点心得,大家分享!
集思广益、坚持不懈的总结,总会进步!

参考资料:
1.Android Developers
2.Android 中文API
3.http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html
4.http://blog.youkuaiyun.com/lmj623565791/article/details/37970961
5.http://segmentfault.com/a/1190000002400391

6.http://blog.youkuaiyun.com/sdlgxxy/article/details/6226127


源码下载地址:点击打开链接


【Android】Fragment与Activity间通信知识总结 就是在MainActivity进行动态注册时,把data通过构造方法传参的形式传给fragment,所以要对fragment类进行修改。我这里有两个碎片在MainActivity上放着,并且他们各自都有一个按钮和文本,按钮用来发送数据,文本用来接收显示数据。这样,当数据发生变化时,我们可以通过这个变量来调用对应的实现,以通知数据变化。是一个用于携带数据的键值对集合,它可以保存各种类型的数据,本身是一个实现了。接口的类,因此它可以被序列化以便在组件之间传递。方法则是在视图创建完成后调用的,使用。 阅读详情

相关推荐

(十)安卓开发中的Activity之间的通信使用详解

下面将结合代码和具体在 Android 开发中,Activity 之间的通信是非常常见且核心的功能之一使用场景,详细讲解这几种方式。

cuijiying的博客 1280

【Android -- 四大组件】Fragment 与 Activity 之间通信

本篇主要总结一下 Fragment 与 Activity 之间通信。

Kevin Learn Android 1万+

Android进程间通信:两个应用之间如何传值

两个应用之间如何传值,其实这个标题太水了,专业的说法是“两个进程间如何传值”,什么?!还不够专业,好吧,你淫了!“进程间通信”其实更专业,这回你总满意了吧!顺带说一下,简写成IPC:Inter-Process Communication。 兄弟们,如果你们从搜索引擎或者其他途径找到这篇文章的话,说明你的Android技术已经提升到一个很高的层次了哦,嘿嘿~为什么这么说呢?因为无论哪个平台,线

我是程序猿,我为自己代言 3747

Activity之间实时通信

要求:两个Activity ,A和B:在A中启动B,B中的消息要实时传递给A 开发winform的时候多幸福,在Form中声明一个Public属性或方法,直接调用就好了, Android中却没这么简单,这Activity封装的太严实了,根本找不到入口! 查了很多资料,总结下Activity之间的交互,下大致有下面几种办法: 1.startActivityForResult,缺点:只能在返...

机器时代 2617

Android不同Activity之间的通信方式

android不同Activity之间的通信方式,几秒钟教会你Android中集中常用的Activity通信

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

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

weixin_29302047的博客 526

Android——Activity组件间的通信方式

目录1.Activity之间传值1.单个数据传送1. 布局——MainActivity.xml(跳转前的)2. MainActivity.java (跳转前的)3.MainActivity3.java(跳转后的)4.效果展示2.打包传送1.新建类Kind.java2.MainActivity.java(跳转前的)3.MainActivity3.java(跳转后的)3.回传值1.MainActivity.java2.MainActivity3.java3.效果展示 1.Activity之间传值 1.单个数据传

mengmengde_的博客 1151

微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

j0k1l2m3n的博客 458

Activity之间的通信方式

个人总结:Activity之间的通信方式、Android Results API、EventBus

weixin_45351038的博客 1517

云计算虚拟化实验(一)——虚拟机软件VMware的安装以及虚拟机系统的安装(Windows7+CentOS7)

主要内容: 1、虚拟机软件的安装(以VMware为例) 2、虚拟机系统的安装(Window7 + CentOS7) 3、虚拟主机网络互访 4、不同局域网内的虚拟主机互访(软路由——海蜘蛛) 0 ——首先介绍一下什么是虚拟化? 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在

gg_asd的博客 1万+

鲁棒优化 (Robust Optimization) 算法详解及案例分析

鲁棒优化是一种用于处理不确定性优化问题的方法。其目标是在不确定性参数的可能取值范围内,找到一个对不确定性具有鲁棒性的解。

闲人编程的博客 4328

Android Activity间通信

Intent的两种方式、Bundle介绍、Activity间的通信

知非 1186

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1195

Android Activity、Fragment间通信

Activity中获取Fragment // 用于静态创建的Fragment getSupportFragmentManager().findFragmentById(int id); // 用于动态创建的Fragment getSupportFragmentManager().findFragmentByTag(String tag); // 用于动态创建的Fragment getSuppo...

GracefulGuigui的博客 427

GEE:本地影像上传到GEE的Assets中,并输入机器学习算法中作为特征变量

当我们在 Google Earth Engine(GEE)中应用机器学习算法时,会输入一些影像作为特征变量数据,进一步根据这些特征影像去推理未知区域的数据。但是 GEE 平台上计算特征变量的 API 函数并不是非常全面,我们希望获得更多的特征用于分类。这个时候,我们可以将本地计算的特征影像上传到 GEE 中进行后续处理。本文记录了从本地上传特征数据到 GEE 的 Assets 中的教程,用于后续在 GEE 中分类或者回归使用。本文也可作为《》一文的补充。

养乐多的博客 1730

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

专业解决各种上架过包问题,专业团队专业处理 3187

android 进程间通信Activity

Activity跨进程调用其实很常见,比如在第三方sdk中的分享,授权登录等,如果我们有多个应用包相互调用共享activity 是要用到的。 1.新建项目,用于被调用 主activity 为 ReceiveActivity 2.注册activity,并且设置action &lt;application android:allowBackup="true" ...

豌豆的专栏 611

TBOX电源方案的详细讲解与分析

输入保护电路是确保车载电子系统稳定性的关键。通过合理选择TVS二极管、保险丝和浪涌抑制器等元器件,能够有效防止来自电源系统的瞬态过电压、浪涌和过流问题,保护后续电路免受损害。针对不同的电源环境和应用场景,可以通过提升功率、优化热管理以及选择高效元器件来进一步提高系统的保护能力和可靠性。

weixin_43199439的博客 1075

android activity间通信生命周期

一、activity A 启动Activity B 的过程,A生命周期的执行: 二、从B返回到A ,A生命周期的执行过程:

binbinbintony的博客 163

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android Activity间通信全解析:Intent、Bundle与数据恢复策略

在Android开发中,页面间的跳转与数据传递是最基础也最容易埋坑的环节。Activity作为界面承载单元,其通信方式直接决定了代码的健壮性与可维护性。Intent是发起跳转的核心载体,而Bundle则负责承载待传递的数据,其底层受Binder缓冲区大小限制,大对象直接传递极易导致TransactionTooLargeException。对于自定义对象,Parcelable与Serializable的选择体现着性能与稳定性的权衡。随着组件化演进,官方用Activity Result API取代了旧的star

weixin_32308101的博客 313

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 应用中多进程 activity和Service 间通信

昨天天算法组同事给我了两个新so文件,给我说速度提升好几倍,心想更换so文件,提示识别效率,心里就美滋滋的。等我拿到so文件替换 运行后才发现,so底层库报错了,查找了好久,最后定位错误是Android端 运行这两个so文件时不能在同一进程中,也就是说需要开启多进程。然后就按照标准方法,新建MyService,在Manifest 中注册android:process = "com.test.mys...

XuWei1213的博客 1691

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

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

Android进程间通信之Service和Activity之间的通信

安卓项目开发中经常会遇到Service和Activity之间通信的情况,Service的数据更新,通知Activity中UI更新。 Service和Activity之间的通信主要有三种: bindService(); 广播Broadcast; hander机制 一、利用hander机制实现Service通知Activity更新UI public class DemoActivity exten...

Sunxiaolin2016的博客 1073

关于android 下activity间通信的问题-广播机制

从网上搜了下android 广播机制,用来实现不同activity之间的通信,也可以说是消息监听,主要为了实现一个activity 在另一个activity某个状态下的反应,精华如下:              Broadcasttest myBroadcastReceiver; ….       //注册消息        myBroadcastReceiver = new

shan1021的专栏 1005

安卓进阶(2)之android Binder通信理解

关键字 aidl 进程间通信 binder机制 aidl 全名安卓接口定义语言,用于进程间通信。简单理解的话,就是类似应用的服务器和客户端。服务器开启一个服务处理数据,客户端传递数据以及响应回调。具体使用方法见AndroidStudio实现AIDL。建议自己跟着文章手写一遍,并细看build之后由aidl文件生成的java文件中内容。 参考文章 AndroidStudio实现AI...

罗小辉的专栏 713

Android 进程间通信 Intent机制 隐式启动Activity

最近对Android的进程间,程序的通信做了细致的研究,分享一下心得。 构造环境: A,B两个程序,A在运行中,将某个值传递给B,并启动B程序。 B程序完成处理后,将处理结果返回给A程序,A程序继续后续的执行。 � 场景中B是被调用模块,需要在其AndroidManifest.xml中添加以下内容

专注JAVA开发 1816

todo【面经】牛客网安卓相关面经题

1.安卓的四大组件 【todo】 2.activity的生命周期 【todo】 3.binder通信原理 【todo】

TQY724的博客 229
上一篇: Android之string.xml 使用总结
下一篇: Android之DialogFragment
行云间
博客等级 码龄12年 438粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值