安卓面试题

1.android中的动画有哪几类?

两种:Tween(补间动画)、Frame(帧动画);

2.简述Handler的机制原理?

android提供了handler和Looper来满足线程间的通信。Handler先进先出原则;

Looper类用来管理特定线程内对象之间的消息交换;

1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列);

2)Handler:你可以构造Handler对象来与Looper进行沟通,以便push新消息Message Queue里;或者接收Looper从MessageQueue取出所送来的消息。

3)Message Queue(消息队列):用来存放线程放入的消息;

4)线程:UI Thread通常就是主线程,而android启动程序时会替他建立一个Message Queue。

3.说说MVC模型的原理,在android中的运用?

MVC:Model、View、Controller

4.通过Intent传递一些二进制数据的方法有哪些?

1)使用Serializeble接口实现序列化;

2)实现Parcelable接口,这合理Android的部分类比如bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也是常见的。

5.在onCreate方法中Bundle savedInstanceState 这个参数有什么作用?

参考答案:

在onCreate方法中有saveInstanceState这个参数,其实这个参数对应两个方法。void onSaveInstanceState(Bundle outState);void onRestoreInstanceState(Bundle savedInstanceState)。当某个activity变得“容易”被系统销毁时,说白了就是系统在内存不足或者其他异常情况下把你的Activity销毁时,将调用这个方法。需要注意的是它是系统调用的,并且你的Activity是被动得被销毁。你可以在销毁的时候保存一下数据。然后在onCreate方法中拿出来。那什么情况下能触发这两个方法呢?
1)、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2)、长按HOME键,选择运行其他的程序时。
3)、按下电源按键(关闭屏幕显示)时。
4)、从activity A中启动一个新的activity时。
5)、屏幕方向切换时,例如从竖屏切换到横屏时。
在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行


总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

6.Activity的生命周期?

在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。

Activity有四种本质区别的状态:
1
)在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
2)如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
3)如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
4)如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。

Activity提供了7个生命周期方法:
onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()。在这七个生命周期方法中有三个关键的循环。其实官方给的那张图画得很明白,但估计很少人能有耐心去揣摩。那就换种方式展现。看图吧:
1)以下该图呈现了一个Activity完整的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在 onDestory()释放所有的资源。
首先我们运行程序,这是打开MainActivity依次调用onCreate->onStart->onResume,这时MainActivity在栈顶,与我们交互的Activity都在栈顶。然后我按下返回键,则会依次调用onPause->onStop->onDestory。这属于一个完整的生命周期。

7、谈谈你对BroadCastRceiver的理解?

参考答案:

广播接收者,android四大组件之一,也是唯一一个能动态注册的组件。
1)广播接收者是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
2)应用程序可以拥有任意数量的广播接收者以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。
3)广播接收者没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

 

8、 广播分几种?他们有什么区别?

参考答案:
广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。
然而有序广播是按照接收者声明的优先级别,被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C 。优先级别声明在 intent-filter 元素的 android:priority 属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置 。有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。

另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()

发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,
前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

9、 广播的生命周期?

参考答案:
广播的生命周期是非常短的,当发送之后intent会到AndroidManifest.xml文件中找是不是有匹配的action,如果有就会调用Receiver ,然后获得Receiver 对象,再执行onReceive方法,这时候Receiver对象就没有用了,当我们再次点击按钮的时候就会重新获得对象,这就是BroadcastReceiver的生命周期.
在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框.
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成.这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束,BroadcastReceiver就先结束了.BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程).如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死.所以采用子线程来解决是不可靠的.

9、 两种注册BroadcastReceiver的方法?

参考答案:
使用在manifest中注册的方法注册BroadcastReceiver,即使你的应用程序没有启动,或者已经被关闭,这个BroadcastReceiver依然会继续运行,这样的运行机制可能会给软件的用户造成困扰。所以作为程序的开发者,我们希望能够有一种灵活的机制完成BroadcastReceiver的绑定和解除绑定操作。Android当然也考虑到了这些问题,所以在Context这个类当中提供了如下两个函数可以在代码中注册:

i. registerReceiver(receiver,filter);
这个函数的作用就是将一个BroadcastReceiver注册到应用程序当中,这个函数接收两个参数,第一个参数是需要注册的BroadcastReceiver对象,第二个是一个IntentFilter。第一个参数是非常容易理解的,第二个参数的作用是定义了哪些Intent才能触发这个注册的BroadcastReceiver对象。

ii. unregisterReceiver(receiver);
这个方法就非常的简单了,用于解除BroadcastReceiver的绑定状态。一旦解除完成,响应的BroadcastReceiver就不会再接收系统所广播的Intent了。

两种注册BroadcastReceiver的方法

1.在应用程序的代码中进行注册
注册BroadcastReceiver
registerReceiver(receiver,filter);
取消注册BroadcastReceiver
unregisterReceiver(receiver);
2.在AndroidManifest.xml当中进行注册

<receiver android:name="SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

两种注册BroadcastReceiver方法的比较:
现在我们了解了两种注册BroadcastReceiver的方法之后,需要考虑一下这两种方法适用的场合:

i. 第一种注册的方法可以保证在应用程序安装之后,BroadcastReceiver始终处于活动状态,通常用于监听系统状态的改变,比如说手机的电量,wifi网卡的状态(当然,监视这些东西也是取决于软件的需求)。对于这样的BroadcastReceiver通常是在产生某个特定的系统事件之后,进行相应的操作,比如说wifi网卡打开时,给用户一个提示;

ii. 第二种注册方法相对第一种要灵活的多,这样注册的BroadcastReceiver通常用于更新UI的状态。一般来说,都是在一个Activity启动的时候使用这样的方法注册BroadcastReceiver,一旦接收到广播的事件,就可以在onReceive方法当中更新当前的这个Activity当中的控件。但是需要注意的是如果这个Activity不可见了,就应该调用unregisterReceiver方法来解除注册

 

10、android 中线程与线程,进程与进程之间如何通信

参考答案:
1 、一个 Android 程序开始运行时,会单独启动一个 Process 。
默认情况下,所有这个程序中的 Activity 或者 Service 都会跑在这个 Process 。
默认情况下,一个 Android 程序也只有一个 Process ,但一个 Process 下却可以有许多个 Thread。

2
、一个 Android 程序开始运行时,就有一个主线程 Main Thread 被创建。该线程主要负责 UI 界面的显示、更新和控件交互,所以又叫 UI Thread 。
一个 Android 程序创建之初,一个 Process 呈现的是单线程模型 — 即 Main Thread ,所有的任务都在一个线程中运行。所以, Main Thread 所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死现象)。

3 、 Android 单线程模型: Android UI 操作并不是线程安全的并且这些操作必须在 UI 线程中执行。如果在子线程中直接修改 UI ,会导致异常。

11、View如何进行刷新?
参考答案:

在一个开启的线程中调用handler对象的sendMessage方法发送信息,在UI线程中调用handler对象的回调方法handleMessage进行处理,在回调方法中执行invalidate或者postInvalidate.

12、ANR是什么?哪些情况下会发生?开发时如何避免ANR?

参考答案:

ANR(Application Not Responding):应用程序无应答。默认情况下,在android中Activity的最长阻塞时间是5秒,BroadcastReceiver的最长执行时间则是10秒。为了避免出现ANR,可以在做比较耗时操作时,尽量使用子线程或Service。

13、请描述SAX、DOM、PULL解析xml的原理,以及各自优缺点。

参考答案:

这里首先明白什么是SAX是一个用于处理XML事件驱动的“推”模型,优点是一种解析速度快并且占用内存少的xml解析器,它需要哪些数据再加载和解析哪些内容。缺点是它不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。
DOM是一种文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。Dom技术使得用户页面可以动态地变化,如 可以动态地显示或隐藏一个元素,改变它们的属性,增加一个元素等,Dom技术使得页面的交互性大大地增强。缺点是DOM解析XML文件时,会将XML文件 的所有内容以文档树方式存放在内存中。
Pull解析和Sax解析很相似,Pull解析和Sax解析不一样的地方是pull读取xml文件后触发相应的事件调用方法返回的是数字还有pull可以在程序中控制想解析到哪里就可以停止解析

14、请解释什么是AIDL?

参考答案:

AIDL:Android Interface Definition Language,即Android接口描述语言。

Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。

为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、Broadcast和Content Provider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。

15、DIP、DPI分别是什么?

参考答案:

dip(device independent pixels)设备独立像素, 与设备屏幕有关。dpi:屏幕像素密度。
android最早是没有考虑到这么多屏幕分辨率的。最早的机器是g1,他的分辨率是480*320。但是,由于android是开放的平台,各种各样分辨率的设备都可以运行。为了兼容这些平台,android从1.6开始,加入了设备独立像素,dip或者dp。标准屏幕480*320上,px与dip是1比1的。分辨率高的,比如800*480,就要按比例兑换成480*320。
开发者在开发的时候,ui设计时最好用dp,系统会自动按比例计算为px,从而适配视图。

dpi是屏幕像素密度。就是1英寸上像素点的个数。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚。比如iphone4的视网膜级的屏幕肯定比iphone 3gs的屏幕像素密度高的多。 对于开发者来说,这个不是很重要。

16、请介绍下Android中常用的五种布局。

参考答案:

FrameLayout(框架布局)
LinearLayout
(线性布局)
AbsoluteLayout(绝对布局)
RelativeLayout(相对布局)
TableLayout(表格布局)

17、请介绍下Android的数据存储方式。

参考答案:

一.SharedPreferences方式
二.文件存储方式
三.SQLite数据库方式
四.内容提供器(Content provider)方式
五. 网络存储方式

18、请说明隐式、显式Intent的区别?

参考答案:

显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。

隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。

在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。

而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。

19、请说明getWritableDatabase()和getReadableDatabase()的区别?

参考答案:

getReadableDatabase()并不是以只读方式打开数据库,而是先执getWritableDatabase(),失败的情况下才调用。getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

20、 请描述下Activity的生命周期。

参考答案:

activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory()。

activity主要生命周期的方法说明:
onCreate(Bundle savedInstanceState)
:创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():activity被完全从系统内存中移除时调用,该方法被调用

21、如何将一个Activity设置成窗口的样式。

参考答案:

只需要设置 一下Activity的主题就可以了,在AndroidManifest.xml 中定义 Activity的地方加上android :theme="@android:style/Theme.Dialog"这就使你的应用程序变成对话框的形式弹出来了。或者android:theme="@android:style/Theme.Translucent"。就变成半透明的。

22、如何退出Activity?

参考答案:

对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。

23、你如何评价Android系统优缺点?

参考答案:

优势:
一、开放性 三、丰富的硬件选择 五、无缝结合的Google应用支持

缺点:

一、安全和隐私
二,开发商自定义,不够统一 四、同类机型用户减少

24、返回键与Home键区别?

参考答案:

返回键默认行为是finish处于前台的Activity的即Activity的状态为Destroy状态为止,再次启动该Activity是从onCreate开始的(不会调用onSaveInstanceState方法)。Home键默认是stop前台的Activity即状态为onStop为止而不是Destroy,若再次启动它,会调用onSaveInstanceState方法,保持上次Activity的状态则是从OnRestart开始的---->onStart()--->onResume()。

25、如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

参考答案:

在”暂停 onPause” 状态将数据保存。

26、请介绍下ContentProvider是如何实现数据共享的?

参考答案:

一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。

要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?

Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

27、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

参考答案:

程序出现异常,比如NullPointerException

避免:编写程序时逻辑连贯,思维缜密。能捕获异常,在logcat中能看到异常信息,定位错误并修改错误

28、请简述Android应用程序结构是哪些?

参考答案:

Android应用程序结构是:

Linux Kernel(Linux内核)、Libraries(系统运行库或者是c/c++核心库)、Application 

Framework(开发框架包)、Applications (核心应用程序)

 

29、横竖屏切换时候activity的生命周期?

参考答案:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

  2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

  3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

30、DDMS和TraceView的区别?

参考答案:

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView程序性能分析器

 

———————————————————————————————————————

面试题目(android

1 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

2sim卡的EF 文件有何作用

3、嵌入式操作系统内存管理有哪几种,各有何特性

4、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

5、一条最长的短信息约占多少byte?

6 android中的动画有哪几类,它们的特点和区别是什么?

7handler机制的原理

8、说说mvc模式的原理,它在android中的运用

9Activity的生命周期

10、让Activity变成一个窗口:Activity属性设定

12、调用与被调用:我们的通信使者Intent

13、如何退出Activity?如何安全退出已调用多个ActivityApplication?

14、请介绍下Android中常用的五种布局。

15、请介绍下Android的数据存储方式。

16、如何启用Service,如何停用Service

17、注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

18、请解释下在单线程模型中MessageHandlerMessage QueueLooper之间的关系。

19 AIDL的全称是什么?如何工作?能处理哪些类型的数据?

20、请解释下Android程序运行时权限与文件系统权限的区别。

21、系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

22. 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%

23、你如何评价Android系统?优缺点。

24、什么是ANR 如何避免它?

25、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

26Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

27、简要解释一下activity intent intent filterserviceBroadcaseBroadcaseReceiver

28IntentService有何优点?

29、如何将SQLite数据库(dictionary.db文件)apk文件一起发布?

30、如何将打开res aw目录中的数据库文件?

31Android引入广播机制的用意?

32、描述JNI的调试过程

33ANDROID的应用程序是哪些

34、关于SQLiteOpenHelper的应用要写代码的就是创建数据库什么的

35、进度条的应用要写代码的题目大致意思是10秒让1条进度条跑完

36、Activity生命周期:
37、.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
38、Service的启用和停用
39、广播注册有几种,有什么区别?
40、Android的数据存储方式?如果有大量图片处理,怎么缓存
41、解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系?
42、AIDL的全称是什么?如何工作?能处理哪些类型的数据?  
43、请解释下Android程序运行时权限与文件系统权限的区别?
44、android和iphone的见面设计优缺点
45、android的5大布局,说说在什么场景使用?

 

编程题:

1、web service网络编程有几种

2、http通讯,get和post区别,

3、网络编程,貌似http或Web service

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值