Android开发技术文档
- 格式:docx
- 大小:39.09 KB
- 文档页数:14
Linux操作系统的传统理念就是内存用的越多越好,尽可能拿来用,既然被尽量的使用,自然应该有清除机制。
Android以 Linux为基础,自然部分继承了这个特性。
Android使用lowmemorykiller在达到某个内存门限的情况下去选择进程删除来释放内存。
关键的配置文件有如下两个,/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree配置系统的相关参数。
adj文件包含队列包含oomadj队列,当对应的minfree值达到,则进程的oomadj如果大于这个值将被杀掉。
minfree包含对应oom_adj的警戒值。
参考如下:oom_adj 内存警戒值( 以4K为单位)0 15361 20482 40967 512014 563215 6144一般情况下,默认设置在system/core/rootdir/init.rc中# Define the oom_adj values for the classes of processes that can be# killed by the kernel. These are used in ActivityManagerService.setprop ro.FOREGROUND_APP_ADJ 0setprop ro.VISIBLE_APP_ADJ 1setprop ro.SECONDARY_SERVER_ADJ 2setprop ro.BACKUP_APP_ADJ 2setprop ro.HOME_APP_ADJ 4setprop ro.HIDDEN_APP_MIN_ADJ 7setprop ro.CONTENT_PROVIDER_ADJ 14setprop ro.EMPTY_APP_ADJ 15# Define the memory thresholds at which the above process classes will# be killed. These numbers are in pages (4k).setprop ro.FOREGROUND_APP_MEM 1536setprop ro.VISIBLE_APP_MEM 2048setprop ro.SECONDARY_SERVER_MEM 4096setprop ro.BACKUP_APP_MEM 4096setprop ro.HOME_APP_MEM 4096setprop ro.HIDDEN_APP_MEM 5120setprop ro.CONTENT_PROVIDER_MEM 5632setprop ro.EMPTY_APP_MEM 6144# Write value must be consistent with the above properties.# Note that the driver only supports 6 slots, so we have HOME_APP at the# same memory level as services.write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144# Set init its forked children's oom_adj.write /proc/1/oom_adj -16实际上在frameworks/base/services/java/com/Android/server/am/ActivityManagerService.java中定义了两个更高的优先级。
Android App 技术方案1. 引言本文档旨在为开发 Android 应用程序提供一个技术方案。
在本文中,我们将讨论开发 Android 应用程序的一些关键技术,包括开发环境的搭建、架构设计、用户界面设计、数据存储和网络通信等方面。
2. 开发环境在开发 Android 应用程序之前,我们需要准备一个合适的开发环境。
以下是一些必要的工具和软件:•Android Studio:Android 开发的官方集成开发环境(IDE)。
•Java Development Kit(JDK):Android 应用程序的开发语言是 Java,因此需要安装 JDK。
•Android 调试桥(ADB):用于在设备和开发机之间进行调试和通信。
•设备或模拟器:用于在开发中测试应用程序。
3. 架构设计良好的架构设计是开发高质量 Android 应用程序的关键。
以下是一些常用的架构模式:•Model-View-Controller(MVC):将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,实现数据逻辑和用户界面的分离。
•Model-View-Presenter(MVP):类似于 MVC,但引入了一个表示器(Presenter)来处理视图与模型之间的通信。
•Model-View-ViewModel(MVVM):将视图与模型之间的通信通过一个视图模型(ViewModel)进行处理,实现解耦。
选择适合项目需求的架构模式,并合理分层,可以提高代码的可读性和可维护性。
4. 用户界面设计用户界面是用户与应用程序交互的重要部分。
以下是一些用户界面设计的准则:•Material Design:Google 推出的一种用户界面设计风格,具有简洁、平面和响应式的特点,可增强用户体验。
•响应式布局:根据不同屏幕尺寸和方向自适应调整布局,确保应用程序在各种设备上都能正常显示。
•可访问性:考虑到不同用户的需求,确保应用程序对残障用户也能提供友好的体验。
本android帮助文档为在学习视频时自己制作比较混乱和粗糙,使用时查找第一页导航,再用word的查找功能进行查找导航页——基础说明——监听器的设置->创建监听器——调用android自带的短信发送功能——Activity的方法和生命周期(创建对话框风格的)——Activity的布局方法--LinearLayout线性--常用标签--TableLayout表格--GridView滑动表格--RelativeLayout相对布局——常用控件--除去title和全屏显示--EditText可输入文本框--RadioGroup和RadioButton单选按钮--Toast提示框--CheckBox多选按钮--ProgressBar进度条--ListView可选列表--MENU菜单控件的使用--Animation动画效果--4种动画效果--动画实现--JAVA中的实现--XMl文件中的实现-- Gallery (走马灯式的)移动选择控件--ImageSwitcher图片显示控件--ImageButton图片按钮控件--AlertDialog提示框——Handler的使用---线程--handler的简单应用--用handler更新ProgressBar进度条--handler与线程--线程之间的数据传递--Bundle对象(大量复杂数据) --Message对象(少量简单)--建立一个新的线程--HandlerThread类——SQLite的使用--SQLiteOpenHelper的方法注:带有下划线的是一些封装--代码的编写的可以直接调用的类,在”帮助文档的链接文件\封装的类”文件--封装的DatabaseHelper类夹中都有保存可以直接导入调用--主java文件--命令行的查询方法——文件下载--文件下载--步骤--在注册文件中注册权限--封装的HttpDownLoad类--在Activity中的调用--访问SDCARD --注册权限--封装的FileUtils类--在Activity文件中的调用——_XML文件的解析--SAX常用接口--XMl文件解析实例--实现ContentHandler接口的类--在Activity中的调用 XMl文件实例aaa.xml——广播机制--android中的广播机制--编写BroadcastReveicer类--创建包含BroadcastReveicer类的java文件--在onReceive中处理收到短消息的事件--AndroidManifest.XML注册文件中注册--代码当中进行注册--Activity中发送广播——WIFI--WIFI网卡的状态--操作WIFI网卡所需要的部分权限--改变WIFI网卡的状态——Socket编程--使用基于TCP协议的Socket--使用基于UDP协议的Socket——ServiceAndroid创建基础:src文件中为包类,其中用于建立activity的java文件res中drawable中为图片和标签layout中为布局文件,用于每个activity.java文件的标签布局AndroidManifest中为注册文件,每一个activity的建立都需要在其中注册代码的编写intent对象(用于在不同activity转换时的监听器设置)ponent name 指定activity2.Action 指定activity的作用3.Data 传送的数据类型4.Extras (额外)传送的键值对创建监听器的关键代码:(在第一个activity中)//创建一个Button监听器class myButtonListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//创建一个intent类Intent intent = new Intent();//创建一个键值对intent.putExtra("nexttext", "跳转成功");//创建关联intent.setClass(FirstActivity.this, SecondActivity.class);FirstActivity.this.startActivity(intent);}}在第一个activity中的转换关键标签上绑定监听器:(例在Button标签)(在onCreate中)//在Button上绑定监听器myButton.setOnClickListener(new myButtonListener());在第二个activity中的应用键值对(数据传递):(在onCreate中)//获取键值对Intent intent = getIntent();//获得键值对的值String text = intent.getStringExtra("nexttext");在Activity中调用android自带的短信发送功能的关键代码://调用短信发送功能class myButtonListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//发送号码Uri uri = Uri.parse("smsto://0800000123");Intent it = new Intent(Intent.ACTION_SENDTO,uri);//发送内容it.putExtra("sms_body", "the SMS text");startActivity(it);}}Activity的方法和生命周期:--onCreate 一个activity启动时运行(第一次)--onStart 当activity处于可见状态时运行--onResume 当activity可以得到用户焦点时(可以被操作)运行--onPause 当activity处于暂停状态时(例如弹出其他activity而原activity未被完全覆盖),可在此保存数据,以便此activity释放时恢复原状--onStop 当activity完全不可见时--onRestart 当activity未被销毁而在此被调用时--onDestory 当activity被销毁时当调用finish();语句时,Activity被销毁。
安卓开发 wps 原理一、WPS简介WPS,全称为Android WPS,是一款专为Android平台设计的办公软件。
它提供了丰富的文档处理功能,包括文字编辑、表格制作、演示文稿等,广泛应用于个人和商业场景。
安卓开发 wps 原理,即探讨安卓系统环境下WPS软件的开发原理和实现方式。
二、安卓开发基础安卓开发基于Java和Kotlin语言,使用Android SDK进行开发。
开发者可以使用Java和Kotlin编写应用程序代码,利用Android 提供的API和框架,开发出符合Android操作系统要求的应用程序。
WPS软件的开发过程中,需要利用Android SDK提供的API和框架,实现文档处理功能,同时遵循Android的安全性、稳定性、可扩展性等原则。
三、WPS软件原理1. 文档处理核心:WPS软件的核心功能是文档处理,涉及到文本编辑、格式转换、图片插入、表格制作等。
其实现原理主要是通过读取和写入文档文件,使用Java或Kotlin编写程序代码实现对文档的编辑和处理。
2. 用户界面设计:WPS软件的用户界面设计直接影响用户的使用体验。
其实现原理主要基于Android系统的UI框架,通过布局、样式、主题等设置,实现软件的界面设计。
3. 性能优化:安卓设备性能有限,WPS软件需要实现高效运行,包括内存管理、线程管理、性能优化等方面。
其实现原理主要通过优化代码、使用缓存技术、避免重复计算等方式,提高软件性能。
4. 跨平台支持:WPS软件需要支持多种不同的安卓设备,包括不同型号、不同配置的设备。
其实现原理主要通过适配不同的安卓版本、优化软件大小、兼容不同文件格式等方式,实现跨平台支持。
四、总结安卓开发 wps 的原理涉及到安卓开发基础、文档处理核心、用户界面设计、性能优化和跨平台支持等多个方面。
实现WPS软件需要充分利用Android SDK提供的API和框架,同时遵循Android的安全性、稳定性、可扩展性等原则,实现高效运行和跨平台支持。
Android中文文档:开发和调试在eclipse上开发Android应用程序在用eclipse IDE开发android应用程序之前,你首先要创建一个Android工程,并且建立一个启动配置,在此之后你才可以开始编写,运行,以及调试你的应用程序。
以下章节是假设你已经在eclipse环境中安装了ADT插件,如果你没有安装,请安装之后再使用以下说明。
参考安装eclipse 插件(ADT)创建一个android工程ADT提供了一个新的工程向导,你可以快速的创建一个新的工程或者在现有代码上创建工程。
创建工程的步骤如下:选择File > New > Project选择 Android > Android Project, 然后按下 Next选择项目内容:选择 Create new project in workspace,为编码创建一个全新的工程。
输入工程名称(project name),基础软件包的名称(the base package name),以及Activity 类的名称。
以创建stub .java文件等文件和程序名字。
选择Create project from existing source ,为已有代码创建一个工程。
如果你想编译运行SDK中提供的示例程序,可以使用这个选项。
示例程序的存放在SDK的samples/目录下。
浏览包含已有代码的目录,点击ok,如果目录中包含有可用的android manifest 文件,ADT 将为你填写合适的软件包,activity,和应用程序名称。
按下Finish.ADT插件会根据你的工程类型创建合适的文件和文件夹,如下:src/ 包含stub .java Activity文件的文件夹.res/ 资源文件夹.AndroidManifest.xml 工程清单.创建一个启动项能够在eclipse上运行调试应用程序之前,你必须为它创建一个启动项。
Gaming Service Android SDK 1.0开发者文档V 1.0相关文档/SDK/Sample Code下载地址:http://203.166.164.203/forum.php内容ANDROID GAMECENTER SDK ................................................................................................ 错误!未定义书签。
开发者文档.. (1)1开发环境 (3)2SDK格式 (3)3SDK功能 (3)4SDK使用步骤 (3)4.1导入JAR(A NDROID SDK.JAR) (3)4.2修改A NDROID M ANIFEST 文件 (3)5SDK GAMELINKMANAGER类接口及其API介绍 (4)5.1INITIALIZE 函数 (5)5.2SEND G AME D ATA 函数 (5)5.3GAME O VER 函数 (6)5.4RETURN R OOM 函数 (7)5.5RETURN L OBBY 函数 (7)5.6SUBMIT G AME S CORE函数 (8)6SDK GAMELINKLISTENER类接口及其API介绍 (8)6.1GAME_PREPARE 事件 (9)6.2GAME_STARTED 事件 (10)6.3GAME_DATA R ECEIVED 事件 (11)6.4GAME_OVERED 事件 (13)6.5GAME R ESUME_PREPARE 事件 (13)6.6GAME_R ESUME 事件 (14)1开发环境Android SDK 版本: 1.5 or 以上建议JDK 版本: 1.62SDK格式SDK以jar包形式提供。
3SDK功能SDK提供游戏联网对战P2P数据传送,积分、成就上传,游戏、道具代收费,游戏积分、成就排名,游戏推广等功能。
Android零基础开发专题三:AndroidSDK帮助⽂档使⽤⽅法
在做开发的时候,有⼀个帮助⽂档将能够帮助我们快速开发出软件,Android也⼀样。
今天就和⼤家⼀起分享下Android帮助⽂档的使⽤。
当我们安装完Android SDK之后,我们在android-sdk-windows⽂件夹中能够发现⼀个docs⽂件夹。
docs⽂件夹中就是Android⾃带的帮助⽂档。
进⼊docs⽂件夹中打开index.html,找到reference菜单,会见到如下效果。
左侧是package index(根据包名查找),还可以切换到class index(根据类索引查找)。
⾥⾯都详细介绍了Android技术的使⽤与注意事项。
⾮常详细,可惜是的英⽂。
遇到不认识的我⼀般是联⽹在线翻译,不要砸我啊。
,⽹址是:。
这个帮助还可以联⽹,不过联⽹我们需要“FQ”。
⼤家要想学好Android开发,⼀定要学会查阅帮助⽂档。
《基于Android的移动终端应用程序开发与研究》篇一一、引言随着移动互联网的快速发展,Android作为全球最受欢迎的移动操作系统之一,其应用程序的开发与研究逐渐成为技术领域的热点。
本文将围绕基于Android的移动终端应用程序的开发与研究展开讨论,旨在深入分析Android应用程序的架构设计、开发工具、应用场景及发展趋势等方面,以期为开发者提供参考。
二、Android系统架构设计Android系统采用分层架构设计,主要包括Linux内核层、系统运行库层、应用框架层以及应用层。
各层之间相互独立,具有模块化特点,为应用程序开发提供了丰富的资源与功能支持。
其中,应用层是直接面向用户的部分,包括各种应用程序和用户界面。
三、Android应用程序开发工具Android应用程序开发需要借助一系列工具进行。
首先,Android Studio作为官方开发工具,提供了丰富的开发环境与调试工具。
其次,Java和Kotlin作为Android应用程序的主要编程语言,为开发者提供了灵活的编程接口。
此外,SQLite等数据库技术以及网络通信技术也是Android应用程序开发中不可或缺的部分。
四、Android应用程序开发流程Android应用程序开发流程主要包括需求分析、设计、编码、测试与发布等阶段。
在需求分析阶段,需要明确应用程序的功能需求和用户体验需求。
在设计阶段,需要根据需求进行界面设计、数据库设计以及系统架构设计等。
在编码阶段,根据设计文档进行代码编写与调试。
在测试阶段,对应用程序进行功能测试、性能测试以及兼容性测试等。
最后,将应用程序发布到各大应用商店供用户下载使用。
五、Android应用场景及发展趋势Android应用场景广泛,涵盖了社交、游戏、购物、金融、教育等多个领域。
随着移动互联网的普及和技术的不断发展,Android应用程序的需求逐渐增多。
同时,人工智能、大数据等技术的融入使得Android应用程序具备了更多创新性的功能与用户体验。
一、Introduction(入门)0、Introduction to Android(引进到Android)Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs.To learn how apps work, startwith App Fundamentals.To begin coding right away, read Building Your First AppAndroid提供了丰富的应用程序框架,它允许您在Java语言环境中构建移动设备的创新应用程序和游戏。
在左侧导航中列出的文档提供了有关如何使用Android的各种API来构建应用程序的详细信息。
要了解如何开发应用,从应用基础开始。
如何开始一个正确的编码,请参照建立你的第一个应用程序。
Apps provide multiple entry points 应用程序提供多个入口点Apps adapt to different devices 应用程序适应不同的设备Android apps are built as a combination of distinct components that can be invoked individually. For instance, an individual activity provides a single screen for a user interface, and a service independently performs work in the background.Android应用程序被构建为能够单独地被调用不同的部件的组合。
Android 开发最佳实践从Futurice公司Android开发者中学到的经验。
遵循以下准则,避免重复发明轮子。
若您对开发iOS或Windows Phone 有兴趣,请看iOS Good Practices和Windows client Good Practices这两篇文章。
摘要•使用 Gradle 和它推荐的工程结构•把密码和敏感数据放在gradle.properties•不要自己写 HTTP 客户端,使用Volley或OkHttp库•使用Jackson库解析JSON数据•避免使用Guava同时使用一些类库来避免65k method limit(一个Android程序中最多能执行65536个方法)•使用 Fragments来呈现UI视图•使用 Activities 只是为了管理 Fragments•Layout 布局是 XMLs代码,组织好它们•在layoutout XMLs布局时,使用styles文件来避免使用重复的属性•使用多个style文件来避免单一的一个大style文件•保持你的colors.xml 简短DRY(不要重复自己),只是定义调色板•总是使用dimens.xml DRY(不要重复自己),定义通用常数•不要做一个深层次的ViewGroup•在使用WebViews时避免在客户端做处理,当心内存泄露•使用Robolectric单元测试,Robotium 做UI测试•使用Genymotion 作为你的模拟器•总是使用ProGuard 和 DexGuard混淆来项目Android SDK将你的Android SDK放在你的home目录或其他应用程序无关的位置。
当安装有些包含SDK的IDE的时候,可能会将SDK放在IDE同一目录下,当你需要升级(或重新安装)IDE或更换的IDE时,会非常麻烦。
此外,若果你的IDE 是在普通用户,不是在root下运行,还要避免吧SDK放到一下需要sudo权限的系统级别目录下。
构建系统你的默认编译环境应该是Gradle. Ant 有很多限制,也很冗余。
使用Gradle,完成以下工作很方便:•构建APP不同版本的变种•制作简单类似脚本的任务•管理和下载依赖•自定义秘钥•更多同时,Android Gradle插件作为新标准的构建系统正在被Google积极的开发。
工程结构有两种流行的结构:老的Ant & Eclipse ADT 工程结构,和新的Gradle & Android Studio 工程结构,你应该选择新的工程结构,如果你的工程还在使用老的结构,考虑放弃吧,将工程移植到新的结构。
老的结构:old-structure├─ assets├─ libs├─ res├─ src│ └─ com/futurice/project├─ AndroidManifest.xml├─ build.gradle├─ project.properties└─ proguard-rules.pro新的结构new-structure├─ library-foobar├─ app│ ├─ libs│ ├─ src│ │ ├─ androidTest│ │ │ └─ java│ │ │ └─ com/futurice/project│ │ └─ main│ │ ├─ java│ │ │ └─ com/futurice/project│ │ ├─ res│ │ └─ AndroidManifest.xml│ ├─ build.gradle│ └─ proguard-rules.pro├─ build.gradle└─ settings.gradle主要的区别在于,新的结构明确的分开了'source sets' (main,androidTest),Gradle的一个理念。
你可以做到,例如,添加源组‘paid’和‘free’在src中,这将成为您的应用程序的付费和免费的两种模式的源代码。
你的项目引用第三方项目库时(例如,library-foobar),拥有一个顶级包名app 从第三方库项目区分你的应用程序是非常有用的。
然后settings.gradle不断引用这些库项目,其中app/build.gradle可以引用。
Gradle 配置常用结构参考Google's guide on Gradle for Android小任务除了(shell, Python, Perl, etc)这些脚本语言,你也可以使用Gradle 制作任务。
更多信息请参考Gradle's documentation。
密码在做版本release时你app的build.gradle你需要定义signingConfigs.此时你应该避免以下内容:不要做这个 . 这会出现在版本控制中。
signingConfigs {release {store("myapp.keystore")storePassword "password123"keyAlias "thekey"keyPassword "password789"}}而是,建立一个不加入版本控制系统的gradle.properties文件。
KEYSTORE_PASSWORD=password123KEY_PASSWORD=password789那个文件是gradle自动引入的,你可以在buld.gradle文件中使用,例如:signingConfigs {release {try {store("myapp.keystore")storePassword KEYSTORE_PASSWORDkeyAlias "thekey"keyPassword KEY_PASSWORD}catch (ex) {throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")}}}使用 Maven 依赖方案代替使用导入jar包方案如果在你的项目中你明确使用率 jar文件,那么它们可能成为永久的版本,如2.1.1.下载jar包更新他们是很繁琐的,这个问题Maven很好的解决了,这在Android Gradle构建中也是推荐的方法。
你可以指定版本的一个范围,如2.1.+,然后Maven会自动升级到制定的最新版本,例如:dependencies {compile 'flix.rxjava:rxjava-core:0.19.+'compile 'flix.rxjava:rxjava-android:0.19.+'compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+'compile 'com.fasterxml.jackson.core:jackson-core:2.4.+'compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+'compile 'com.squareup.okhttp:okhttp:2.0.+'compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.+'}IDEs and text editorsIDE集成开发环境和文本编辑器无论使用什么编辑器,一定要构建一个良好的工程结构编辑器每个人都有自己的选择,让你的编辑器根据工程结构和构建系统运作,那是你自己的责任。
当下首推Android Studio,因为他是由谷歌开发,最接近Gradle,默认使用最新的工程结构,已经到beta阶段(目前已经有release 1.0了),它就是为Android开发定制的。
你也可以使用Eclipse ADT,但是你需要对它进行配置,因为它使用了旧的工程结构和Ant作为构建系统。
你甚至可以使用纯文版编辑器如Vim,Sublime Text,或者Emacs。
如果那样的话,你需要使用Gardle和adb命令行。
如果使用Eclipse集成Gradle 不适合你,你只是使用命令行构建工程,或迁移到Android Studio中来吧。
无论你使用何种开发工具,只要确保Gradle和新的项目结构保持官方的方式构建应用程序,避免你的编辑器配置文件加入到版本控制。
例如,避免加入Ant build.xml文件。
特别如果你改变Ant的配置,不要忘记保持build.gradle是最新和起作用的。
同时,善待其他开发者,不要强制改变他们的开发工具和偏好。
类库Jackson是一个将java对象转换成JSON与JSON转化java类的类库。
Gson是解决这个问题的流行方案,然而我们发现Jackson更高效,因为它支持替代的方法处理JSON:流、内存树模型,和传统JSON-POJO数据绑定。
不过,请记住, Jsonkson库比起GSON更大,所以根据你的情况选择,你可能选择GSON来避免APP 65k个方法限制。
其它选择: Json-smart and Boon JSON网络请求,缓存,图片执行请求后端服务器,有几种交互的解决方案,你应该考虑实现你自己的网络客户端。
使用Volley或Retrofit。
Volley 同时提供图片缓存类。
若果你选择使用Retrofit,那么考虑使用Picasso来加载图片和缓存,同时使用OkHttp作为高效的网络请求。
Retrofit,Picasso和OkHttp都是有同一家公司开发(注:是由Square公司开发),所以它们能很好的在一起运行。
OkHttp 同样可以和Volley在一起使用 Volley.RxJava是函数式反应性的一个类库,换句话说,能处理异步的事件。
这是一个强大的和有前途的模式,同时也可能会造成混淆,因为它是如此的不同。
我们建议在使用这个库架构整个应用程序之前要谨慎考虑。
有一些项目是使用RxJava完成的,如果你需要帮助可以跟这些人取得联系: Timo Tuominen,Olli Salonen, Andre Medeiros, Mark Voit, Antti Lammi, Vera Izrailit, Juha Ristolainen. 我们也写了一些博客:[1], [2], [3], [4].如若你之前有使用过Rx的经历,开始从API响应应用它。