《Android 4.X 从入门到精通》:源代码深度解析

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:《Android 4.X 从入门到精通》是为Android开发新手准备的综合性教程,涵盖了从基础知识到高级技术的全方位技能。本书由李波等专家撰写,详细介绍了如何使用Android Studio、管理SDK与AVD、编写AndroidManifest.xml文件,以及深入讲解了Activity、Intent、布局与视图控件、数据存储、资源管理、多线程与异步任务、服务、广播接收器、内容提供者、通知、权限管理、碎片、手势识别、动画、网络编程、Google Play服务、单元测试与调试、性能优化等关键开发概念。本课程的源代码不仅提供理论知识,还通过大量实例加深学习者的实际操作经验,使他们能更好地应用这些核心概念于项目开发中。 Android

1. Android Studio入门指导

欢迎进入Android开发的世界!在本章中,我们将介绍Android Studio这一强大的集成开发环境(IDE)的安装与配置。无论你是经验丰富的开发者还是初学者,本章都将为你搭建一个高效的开发平台,并帮助你熟悉其基本功能与特点。

安装Android Studio

  1. 下载安装包 :前往 Android Studio官网 下载适用于你操作系统的最新版本安装包。
  2. 运行安装程序 :双击下载的安装包,按照提示完成安装向导。安装过程中,可以选择安装Android SDK和虚拟设备(AVD)。
  3. 初次启动 :安装完成后,首次启动Android Studio会引导你进行配置,包括选择默认的SDK、主题样式等。

配置开发环境

  1. 检查SDK和虚拟设备 :通过"Tools" -> "SDK Manager"检查并安装所需版本的Android SDK或更新现有的SDK。
  2. 创建新项目 :点击"Start a new Android Studio project",选择一个适合的项目模板开始你的第一个应用开发之旅。

基本使用方法

  1. 项目结构 :了解Android Studio中的项目目录结构,包括源代码、资源、配置文件等。
  2. 界面概览 :熟悉编辑器、调试窗口、日志控制台等界面组件的功能。
  3. 快捷键与代码补全 :利用快捷键提高编码效率,使用代码补全功能快速输入代码。

通过以上步骤,你将建立起Android Studio的开发环境。下一章,我们将深入探索Android SDK与AVD的使用,进一步加强你的开发能力。

2. Android SDK与AVD使用

2.1 Android SDK核心组件

2.1.1 SDK平台工具与组件概览

Android SDK(Software Development Kit)为开发者提供了一系列工具和库文件,使他们能够开发在Android平台上运行的应用程序。核心组件包括构建工具、平台工具、各种库以及模拟器组件。

构建工具用于编译和打包应用,例如Gradle构建系统。平台工具则提供了如adb(Android Debug Bridge)这样的调试和测试工具。SDK Manager允许开发者下载特定的API级别、系统镜像、库和工具。

代码块示例: SDK Manager命令行工具使用示例

./sdkmanager "platform-tools" "build-tools;29.0.2" "platforms;android-29"

参数说明: 上述命令将下载平台工具、构建工具版本29.0.2,以及Android 29平台。

代码执行逻辑: 这个命令确保了所有必要的构建和平台文件被下载至本地环境,开发者可以使用这些文件构建和测试针对API级别29的应用程序。

2.1.2 SDK更新与管理

SDK更新是保持Android应用兼容性和利用最新API的重要步骤。开发者可以通过Android Studio内置的SDK Manager更新或安装新的SDK组件。

mermaid格式流程图示例: SDK更新流程图

graph LR
A[开始更新SDK] --> B[打开SDK Manager]
B --> C{选择需要更新或安装的组件}
C --> D[下载并安装组件]
D --> E[确认更新完成]
E --> F[关闭SDK Manager]

步骤说明: 1. 打开Android Studio。 2. 进入Tools > SDK Manager。 3. 在SDK Platforms选项卡中,选择需要更新或安装的Android平台版本。 4. 在SDK Tools选项卡中,选择需要更新的工具。 5. 点击"Apply"或"OK"按钮开始下载和安装过程。 6. 下载完成后,关闭SDK Manager。

代码块示例: 在项目中使用特定平台的SDK

<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="29"/>

参数说明: 上述代码表示该应用最低支持Android 4.1(API级别16),目标平台是Android 10(API级别29)。

2.2 Android虚拟设备(AVD)管理

2.2.1 创建与配置虚拟设备

使用Android Virtual Device (AVD) Manager可以创建和配置虚拟设备,这些设备模拟真实世界的Android设备,以便开发人员在无需物理设备的情况下测试他们的应用。

mermaid格式流程图示例: 创建AVD的流程图

graph LR
A[启动AVD Manager] --> B[选择创建新的虚拟设备]
B --> C[选择设备类型和系统镜像]
C --> D[配置虚拟设备参数]
D --> E[保存并启动虚拟设备]

2.2.2 AVD的性能调优和使用技巧

为了提高模拟器的性能,开发者可以采取多种优化措施,例如调整模拟器的内存大小,启用硬件加速等。

代码块示例: 启用Intel HAXM以提升AVD性能

# 通过命令行启用HAXM,前提是设备支持
./emulator -accel on -avd Pixel_2_API_30 -memory 4096 -cores 4

参数说明: - -accel on 开启加速。 - -avd Pixel_2_API_30 选择要启动的虚拟设备名称。 - -memory 4096 为AVD分配4GB内存。 - -cores 4 使用4个虚拟CPU核心。

代码逻辑说明: 上述命令优化了模拟器的运行环境,使得虚拟设备更接近于真实的硬件性能,有助于开发者获得更准确的性能测试结果。

2.2.3 AVD使用技巧

AVD不仅可用于应用的日常测试,也可以利用其高级选项进行特定场景的模拟,例如使用不同的网络速度、电量模式等,从而达到更全面的测试效果。

表格示例: AVD高级模拟选项

| 选项 | 描述 | 可用值 | | --- | --- | --- | | Network Speed | 模拟不同的网络速度 | full, 3G, 4G, Edge, GPRS, None | | Battery | 模拟电量情况 | full, charging, 20%, 10%, 5%, dead | | Network Throttle | 模拟网络延迟 | none, GPRS, Regular 2G, Good 2G, Regular 3G, Good 3G, Regular 4G, Good 4G, WiFi |

注意: 通过模拟不同的测试环境,可以更早地发现和修复应用在特定条件下可能出现的问题,从而提高应用的稳定性和兼容性。

3. Android应用基础

3.1 AndroidManifest.xml配置详解

3.1.1 应用声明与权限配置

在Android应用开发中, AndroidManifest.xml 文件扮演着至关重要的角色,它是每个Android应用必须包含的文件,用于描述应用的基本信息和属性,包括应用包名、组件声明(Activity、Service、BroadcastReceiver和ContentProvider)、权限声明以及应用所需的系统权限等。通过这个文件,系统能够在运行时了解应用的结构和功能,因此它是应用安全性和兼容性的核心所在。

首先,应用声明是通过 <application> 标签进行的,它包含了应用中的主要组件以及一些全局设置。例如:

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这里, <activity> 标签定义了一个Activity组件,而 <intent-filter> 描述了它可以响应的Intent动作和类别,使得应用可以出现在设备的应用启动器中。

权限配置方面,我们可以在 AndroidManifest.xml 中声明应用所需的权限,这样应用就可以请求系统赋予其执行特定操作的能力。例如,若应用需要访问用户的联系人,必须声明以下权限:

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

系统权限的管理是通过 <uses-permission> 标签实现的,它可以声明应用需要使用的系统权限。当应用需要使用敏感数据或执行特殊操作时,必须得到用户明确的授权。

3.1.2 活动、服务、广播接收器和内容提供者配置

除了应用声明和权限配置外, AndroidManifest.xml 文件中还需要对应用的其他核心组件进行声明:

  1. 活动(Activity) :活动是用户可以进入和离开的单一屏幕。一个应用可以包含多个活动,并且每个活动通常都会在 AndroidManifest.xml 中进行声明。

  2. 服务(Service) :服务是一种在后台运行且不提供用户界面的组件,它可以执行长时间运行的操作或远程处理。

  3. 广播接收器(BroadcastReceiver) :广播接收器用于接收来自其他应用或系统的广播消息。

  4. 内容提供者(ContentProvider) :内容提供者是管理和共享应用数据的接口,其他应用可以通过内容提供者查询或操作数据。

每一个组件都可以通过 <activity> <service> <receiver> <provider> 标签进行声明,并可以配置特定的属性来指定组件的行为和数据。

例如,一个服务组件的声明可能如下:

<service
    android:name=".MyService"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
        <action android:name="com.example.MyService" />
    </intent-filter>
</service>

这个服务组件声明了服务的名称和一些属性。 enabled 属性表示服务是否可以被系统实例化, exported 属性表明该服务是否可供其他应用调用。 intent-filter 则是用来指定服务能响应的Intent的动词。

在配置这些组件时,需要确保合理地授予必要的权限,同时遵循最小权限原则,只请求完成必要任务所必需的权限。这种做法有助于增强应用的安全性和用户隐私的保护。

3.2 Activity与Intent的交互机制

3.2.1 Activity生命周期与状态管理

在Android系统中, Activity 是用户界面的基础,是用户与应用交互的主要窗口。它具有自己的生命周期,该生命周期由一系列回调方法组成,它们在特定时刻被系统调用以告知应用状态的改变。理解这些生命周期回调方法对于开发出稳定和资源效率高的应用至关重要。

Activity 的生命周期包括以下几个核心方法:

  • onCreate() : 当Activity首次被创建时调用。
  • onStart() : 当Activity对用户可见时调用。
  • onResume() : 当Activity处于运行状态,并且获得焦点时调用。
  • onPause() : 当另一个Activity对用户可见时调用,当前Activity暂停。
  • onStop() : 当Activity对用户不再可见时调用。
  • onDestroy() : 当Activity被销毁前调用。
  • onRestart() : 当Activity从停止状态重新启动前调用。

在设计应用时,开发者需要在这些生命周期方法中执行适当的逻辑,例如数据加载、状态保存和恢复等。例如:

public class MyActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        // 初始化UI组件,绑定数据等
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 保存应用状态,停止动画和计时器等
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 重新启动动画和计时器,更新UI等
    }
}

3.2.2 Intent的使用和任务栈管理

Intent 是一种在Android组件之间进行交互的机制。它可以启动一个组件(如Activity、Service等),也可以传递数据。在处理 Intent 时,系统会在合适的组件之间进行匹配和跳转,这通常是通过 Intent 所携带的动词(action)和类别(category)来实现的。

例如,启动一个Activity:

Intent intent = new Intent(this, AnotherActivity.class);
startActivity(intent);

在使用 Intent 时,可以指定额外的数据传递给目标组件,如:

Intent intent = new Intent(this, AnotherActivity.class);
intent.putExtra("extra_data", "value");
startActivity(intent);

目标组件通过 getIntent().getStringExtra("extra_data") 来获取传递的数据。

在复杂的Android应用中,组件可能会被启动多次,系统使用任务栈(Task Stack)来管理这些活动。任务栈是一个后进先出(LIFO)的结构,后启动的Activity会放在栈顶。当用户按返回键时,当前Activity会从栈中弹出,并销毁,同时用户会看到之前在栈中的Activity。

为了管理好Activity和任务栈,开发者可以使用 Intent FLAG_ACTIVITY_* 标志来控制Activity的启动模式和栈行为。例如,使用 FLAG_ACTIVITY_CLEAR_TOP 可以在栈中查找并激活已经存在的Activity实例,而不是创建新的实例。

3.3 布局与视图控件开发

3.3.1 布局文件的编写与属性设置

Android应用的布局通常定义在XML文件中,这些布局文件位于项目的 res/layout 目录下。布局文件的根元素是一个布局容器,如 LinearLayout RelativeLayout ConstraintLayout 等。布局文件定义了应用界面的结构和组件的排列方式。

布局文件的基本结构如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <!-- 其他控件... -->

</LinearLayout>

在这个例子中,一个垂直的线性布局 LinearLayout 被创建,所有的子控件会按垂直顺序排列。 TextView 控件被添加到布局中,并通过ID进行引用。布局文件中的每个控件都通过 android:id 属性来设置一个唯一的标识符,以便在Java或Kotlin代码中进行引用。

3.3.2 常用控件的使用方法与自定义技巧

Android提供了大量标准的控件(Widgets),如 Button ImageView ListView 等,它们都可以在布局文件中直接使用。控件的属性定义了它的外观和行为。例如,可以设置 Button 的文本内容、大小、颜色等。

自定义控件通常包含两个方面:重写现有控件的行为和外观,或者创建全新的控件类。自定义控件可以提供特定的应用需求,使应用界面更加丰富和个性化。

自定义控件的一个例子是创建一个带有特殊背景和边角的按钮:

<Button
    android:id="@+id/custom_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Custom Button"
    android:background="@drawable/custom_button_background"
    android:padding="10dp" />

在这个例子中, android:background 属性被用来引用一个定义在 res/drawable 目录下的自定义背景资源。

在代码中,还可以通过编程方式动态地改变控件的属性,例如:

Button button = findViewById(R.id.custom_button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 自定义点击事件的处理逻辑
    }
});

通过这种方式,开发者可以在运行时根据用户交互或其他应用逻辑动态调整控件的行为和样式。

开发Android应用时,理解和熟练使用布局和控件是至关重要的,因为它们是构建用户界面的基础。通过使用布局文件和控件属性,开发者可以设计出既美观又功能强大的用户界面。

4. Android应用高级功能

4.1 数据存储技术概览

在现代移动应用开发中,数据存储是确保用户数据安全和应用良好运行的基础。Android平台提供了多种数据存储机制,每种机制适用于不同的场景。

4.1.1 文件系统与内部存储

在Android中,每个应用运行在独立的沙盒环境中,拥有私有的文件系统目录。应用的内部存储目录用于存放私有数据,可以确保数据的安全性,其他应用无法访问。

File internalDirectory = new File(context.getFilesDir(), "mydata");
File file = new File(internalDirectory, "myfile.txt");

在上述代码示例中, context.getFilesDir() 用于获取内部存储的根目录, File 类用于创建和操作文件。每个应用都可以创建自己的文件目录结构来管理数据。

4.1.2 SQLite数据库的使用和操作

Android内置了SQLite数据库引擎,适合存储结构化数据。在Android中操作SQLite数据库通常涉及创建SQLiteOpenHelper类的实例,管理数据库的创建、版本升级等。

SQLiteOpenHelper dbHelper = new MyDatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();

这里 SQLiteOpenHelper 是一个抽象类,我们需要继承并实现它的 onCreate onUpgrade 方法来创建和升级数据库。 getWritableDatabase 方法则用于获取一个可以进行读写的数据库实例。

4.2 多线程和异步任务处理

随着应用功能的增加,合理使用多线程和异步任务处理变得至关重要。这对于改善用户体验和应用性能至关重要。

4.2.1 线程创建与管理

在Android中,创建和管理线程可以通过继承Thread类或者实现Runnable接口来实现。

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // 执行耗时操作...
    }
});
thread.start();

上述代码演示了如何使用匿名内部类创建一个新的线程。在实际应用中,可能还需要考虑线程之间的通信和线程同步等问题。

4.2.2 异步任务框架AsyncTask的使用

为了简化多线程的使用,Android提供了一个轻量级的异步任务处理框架AsyncTask。AsyncTask允许我们执行后台操作,并在操作完成后更新UI。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
            // 在这里进行线程休眠,可以模拟耗时操作
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}

上述代码中, doInBackground 方法中执行了耗时的后台操作。 onProgressUpdate onPostExecute 方法用于在任务执行过程中和执行完毕后更新UI。

4.3 后台服务(Service)实现

后台服务是Android中用于执行长时间运行操作而不提供用户界面的一种组件。

4.3.1 Service的生命周期与分类

Service有两种类型:前台服务和后台服务。前台服务需要在通知栏显示一个通知,而后台服务则不需要。

public class MyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 启动后台任务
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // 不提供绑定操作
        return null;
    }
}

onStartCommand 方法中定义了服务启动时的行为。返回值 START_STICKY 表示在系统资源不足时,服务会被杀死后尝试重新创建。

4.3.2 服务的启动和绑定方式

服务可以通过 startService 方法启动,当服务不再使用时,通过 stopService 方法停止。服务也可以通过绑定机制和客户端进行通信。

Intent serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);

以上代码演示了如何通过Intent启动服务。绑定服务需要创建一个服务连接类并调用 bindService 方法。

在这一章节中,我们从数据存储到多线程处理,再到服务的实现,逐步深入了解了Android应用高级功能的核心。通过实例代码的展示,我们不仅学习了如何实现这些高级功能,还了解了实现背后的逻辑和细节。这样的深入探讨帮助开发者不仅仅会“使用”,更是能够“掌握”Android应用的高级技术。

5. Android应用优化与扩展

随着移动设备性能的不断提升和应用市场的竞争加剧,应用优化与扩展变得至关重要。优化不仅能让应用运行得更加流畅,还能延长电池寿命,提升用户体验。扩展功能则能够让应用更具吸引力,满足更广泛的用户需求。

5.1 资源管理与优化

5.1.1 资源文件的组织和优化

资源管理是优化Android应用的一个重要环节。开发者需要合理地组织资源文件,并对它们进行优化,以减小应用的体积,提高加载速度。

  • 资源分类 :按照功能和用途,将资源文件进行分类存放,例如将图片存放在 res/drawable/ 目录下,布局文件存放在 res/layout/ 目录下。
  • 多密度资源 :为不同屏幕密度提供相应的资源文件,如 drawable-hdpi drawable-xhdpi 等,以适应不同设备的屏幕。
  • 矢量图形 :使用 vector drawable 代替位图图形可以自适应不同尺寸和屏幕密度,减少资源文件的数量和体积。
  • WebP图片格式 :使用WebP替代PNG和JPEG格式可以显著减小图片大小,同时保持高质量。
  • 删除未使用的资源 :利用工具(如lint)检查并删除未使用的资源文件,减少APK的大小。

5.1.2 应用性能监控与分析

为了有效地进行性能优化,开发者需要监控和分析应用的运行情况。以下是几个常用的工具和方法:

  • Android Profiler :这是Android Studio自带的性能监控工具,可以实时监控CPU、内存和网络的使用情况。
  • TraceView :用于分析应用的执行时间和性能瓶颈。它可以帮助开发者了解应用在运行时调用的方法。
  • Systrace :提供对系统级别的详细性能分析,适合深入理解应用在系统层面的行为。
  • MAT(Memory Analyzer Tool) :可以帮助开发者检测内存泄漏和分析内存使用情况。

5.2 Google Play服务集成

5.2.1 Google API的集成与使用

Google Play服务是Android应用中使用最广泛的集成服务之一,它提供了地图、定位、游戏、广告、支付等API接口。集成Google Play服务可以快速实现这些高级功能。

  • 添加依赖 :在 build.gradle 文件中添加Google Play服务的依赖。
  • API密钥 :申请并配置Google Maps API密钥,用于访问地图服务。
  • 权限管理 :在 AndroidManifest.xml 中声明必要的权限,例如网络访问、位置信息等。
dependencies {
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
}

5.2.2 地图、云服务等高级功能实现

利用Google Play服务,开发者可以轻松实现地图功能、云存储等功能。

  • 地图集成 :通过Google Maps API集成地图,添加标记、路径、多边形等覆盖物。
  • 云存储 :利用Firebase Storage上传和管理文件。
  • 实时数据库 :使用Firebase Realtime Database实现数据的实时同步。

5.3 单元测试与调试技巧

5.3.1 编写和执行单元测试

单元测试是保证代码质量和应用稳定性的重要手段。Android Studio提供了JUnit和Espresso等测试框架。

  • JUnit测试 :编写单元测试来验证应用逻辑的正确性。
  • Espresso测试 :编写UI测试来模拟用户交互,确保界面功能的正确性。

5.3.2 调试工具的使用与调试技巧

Android Studio提供了强大的调试工具,如Logcat、断点、DDMS等。

  • Logcat :查看和过滤应用的日志,分析错误和异常。
  • 断点调试 :设置断点,逐步执行代码来分析程序运行流程。
  • DDMS :使用设备监控器来模拟用户操作、抓取堆栈信息等。

5.4 性能优化最佳实践

5.4.1 内存泄漏检测与解决

内存泄漏是导致应用性能下降和崩溃的常见原因。开发者需要学会使用MAT等工具检测内存泄漏。

  • 代码审查 :定期进行代码审查,注意不要持有不必要的引用。
  • 垃圾回收日志分析 :通过分析GC日志,了解内存分配和回收的情况。

5.4.2 应用启动速度和运行效率优化

应用的启动速度和运行效率直接影响用户体验。以下是几种常见的优化方法:

  • 冷启动优化 :减少应用首次启动时的初始化操作,延迟或异步加载非关键资源。
  • 异步处理 :使用 AsyncTask HandlerThread Kotlin协程 等异步机制处理耗时任务,避免阻塞主线程。
  • 视图优化 :优化布局文件,减少视图层级,使用 ConstraintLayout 提高布局效率。
// 示例:使用Kotlin协程进行异步处理
GlobalScope.launch(Dispatchers.IO) {
    // 异步加载数据
    val data = fetchData()
    withContext(Dispatchers.Main) {
        // 将结果更新到UI
        updateUI(data)
    }
}

在本章中,我们介绍了Android应用优化与扩展的方法,从资源管理、性能监控到Google Play服务的集成,以及单元测试和调试技巧,最后探讨了性能优化的最佳实践。通过本章内容,开发者可以提高应用的运行效率,改善用户体验,从而在日益激烈的市场竞争中脱颖而出。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:《Android 4.X 从入门到精通》是为Android开发新手准备的综合性教程,涵盖了从基础知识到高级技术的全方位技能。本书由李波等专家撰写,详细介绍了如何使用Android Studio、管理SDK与AVD、编写AndroidManifest.xml文件,以及深入讲解了Activity、Intent、布局与视图控件、数据存储、资源管理、多线程与异步任务、服务、广播接收器、内容提供者、通知、权限管理、碎片、手势识别、动画、网络编程、Google Play服务、单元测试与调试、性能优化等关键开发概念。本课程的源代码不仅提供理论知识,还通过大量实例加深学习者的实际操作经验,使他们能更好地应用这些核心概念于项目开发中。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值