Android Java 基础知识体系
第一部分:Android 开发环境与项目结构
开发环境搭建
- JDK (Java Development Kit): 运行 Java 程序的基础,Android Studio 通常会自带一个,但也可以配置系统 JDK。
- Android Studio: 官方推荐的 IDE,集成了代码编辑、调试、模拟器、性能分析等所有必要工具。
- Android SDK (Software Development Kit): 开发 Android 应用所需的工具、库、API 文档和示例代码。
- AVD (Android Virtual Device): Android 模拟器,用于在没有实体手机的情况下测试应用。
Android 项目结构 (以传统 Java 项目为例)
当你创建一个新项目时,Android Studio 会生成如下关键目录:

app/: 应用的主模块。java/: 存放 Java 源代码。com.example.myapp/: 包名,你的所有代码都在这里。MainActivity.java: 应用的主入口界面。MyApplication.java: 自定义 Application 类。
res/: (resource) 存放所有非代码资源文件。layout/: XML 布局文件,定义界面的结构(如activity_main.xml)。drawable/: 图片资源(如.png,.jpg)。values/: 各种 XML 配置文件。strings.xml: 字符串资源,用于多语言适配。colors.xml: 颜色值定义。styles.xml: 样式和主题定义。
mipmap/: 应用图标资源。manifest/: AndroidManifest.xml 文件(应用的全局配置文件)。
AndroidManifest.xml: 最重要的配置文件,它声明了应用的包名、组件(Activity, Service等)、权限、硬件需求等。build.gradle (Module: app): 模块的构建脚本,定义了依赖库(如 Android Support 库)、SDK 版本等。
第二部分:四大核心组件
Android 应用由四个核心组件构成,每个组件都有明确的角色。
Activity (活动)
-
作用: 用户界面的载体,一个屏幕通常对应一个 Activity,一个 App 的登录界面、主界面、设置界面都是不同的 Activity。
-
生命周期: Activity 有一个从创建到销毁的完整生命周期,理解生命周期至关重要,因为它决定了代码在何时执行。
onCreate(): Activity 创建时调用,通常在这里进行初始化工作,如加载布局(setContentView(R.layout.activity_main))、绑定数据等。onStart(): Activity 变为可见时调用。onResume(): Activity 获得焦点,可以与用户交互时调用,这是最活跃的状态。onPause(): Activity 即将进入后台或被半透明覆盖时调用,通常在这里保存临时数据、停止动画等。必须快速执行。onStop(): Activity 完全不可见时调用。onDestroy(): Activity 被销毁前调用,释放资源。onRestart(): Activity 从Stopped状态重新Started时调用。
简化记忆: 创建 ->
onCreate->onStart->onResume(可见可交互) 暂停 ->onPause->onStop(不可见) 销毁 ->onDestroy
(图片来源网络,侵删)
Service (服务)
- 作用: 在后台长时间运行的任务,没有用户界面,播放音乐、下载文件、网络请求等。
- 注意: Service 默认运行在主线程,如果执行耗时操作(如网络请求),需要手动创建新线程,否则会阻塞主线程导致 ANR (Application Not Responding)。
- 类型:
- Started Service: 通过
startService()启动,启动后与启动组件无关,必须手动stopService()或在内部stopSelf()才能停止。 - Bound Service: 通过
bindService()启动,提供一个客户端-服务器接口,允许其他组件(如 Activity)与之绑定、发送请求、获取数据,当所有客户端都解绑后,Service 会自动销毁。
- Started Service: 通过
BroadcastReceiver (广播接收器)
- 作用: 用于接收系统或应用发送的广播消息,它像一个全局的监听器,能让不同组件之间、或组件与系统之间进行通信。
- 例子:
- 系统广播:手机开机、电池电量低、网络状态改变。
- 应用广播:App 更新完成、用户登录成功。
- 注册方式:
- 静态注册: 在
AndroidManifest.xml中声明,这种接收器即使应用没有运行也能接收广播(如开机广播)。 - 动态注册: 在代码中通过
Context.registerReceiver()注册,应用退出时需要unregisterReceiver(),应用不运行时无法接收。
- 静态注册: 在
ContentProvider (内容提供器)
- 作用: 用于统一管理和应用共享数据,它提供了一套标准的接口,让一个应用可以安全地访问另一个应用的数据(如联系人、短信)。
- 数据存储: 通常使用 SQLite 数据库。
- 使用场景: 主要用于系统级数据共享,一般应用内部数据共享更倾向于使用
SharedPreferences或数据库直接操作。
第三部分:UI 布局与交互
布局文件 (XML)
界面布局在 res/layout/ 目录下的 XML 文件中定义,Android 提供了多种布局方式:
- LinearLayout (线性布局): 子元素垂直或水平排列。
- RelativeLayout (相对布局): 子元素相对于父容器或其他子元素进行定位,非常灵活,但嵌套过深会影响性能。
- ConstraintLayout (约束布局): 强烈推荐,通过定义视图之间的约束关系来定位,性能好,可以替代大部分嵌套布局,实现复杂的 UI 界面。
- FrameLayout (帧布局): 子元素堆叠在一起,后添加的会覆盖前面的,常用于做单个视图的容器,如显示一张图片。
- RecyclerView (列表布局): 高效显示滚动列表,它只渲染屏幕可见的项,滚动时复用这些项的视图,非常适合长列表。
View 和 ViewGroup
- View: 所有 UI 组件的基类,如
TextView,Button,ImageView,代表一个可见的 UI 元素。 - ViewGroup: View 的子类,本身也是一个 View,但它的作用是包含其他 View,并负责它们的布局,如
LinearLayout,RelativeLayout。
在 Java 代码中操作 UI
- findViewById(): 在 Activity 中通过 ID 获取 XML 中定义的 View 对象。
TextView myTextView = findViewById(R.id.my_text_view); Button myButton = findViewById(R.id.my_button);
- 设置监听器: 为 UI 组件(如 Button)添加点击事件。
myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击按钮后执行的代码 myTextView.setText("Hello, Android!"); } });
第四部分:数据存储
Android 提供了多种数据存储方式,适用于不同场景。
| 存储方式 | 描述 | 特点 | 适用场景 |
|---|---|---|---|
| SharedPreferences | 键值对存储,底层是 XML 文件。 | 简单易用,只能存储基本数据类型(String, int, boolean等)。 | 存储应用的配置信息、用户设置、登录状态等少量数据。 |
| 内部存储 | 存储在设备内存中,应用私有。 | 只有本应用可以访问,应用卸载时数据被删除。 | 存储私有、敏感的临时数据,如缓存。 |
| 外部存储 | 存储在 SD 卡或共享存储区。 | 其他应用可以访问(需要权限),数据持久存在。 | 存储下载的文件、图片、视频等公共数据。 |
| SQLite 数据库 | 轻量级的关系型数据库。 | 功能强大,支持复杂查询,适合存储结构化数据。 | 存储大量、结构化的数据,如联系人列表、文章内容。 |
| 网络存储 | 数据存储在服务器上。 | 数据可跨设备同步,需要网络连接。 | 云同步、用户数据备份等。 |
第五部分:线程与网络
主线程与 ANR
- 主线程 (UI Thread): 负责处理 UI 绘制和用户交互的所有事件。
- ANR (Application Not Response): 如果在主线程上执行耗时操作(如网络请求、大文件读写、复杂计算),超过 5 秒(对话框是 10 秒),系统就会弹出 ANR 对话框,提示应用无响应。这是必须避免的严重问题。
多线程处理耗时任务
- Thread + Handler: 传统方式,创建新线程执行任务,然后通过 Handler 将结果发送回主线程更新 UI,代码较繁琐,容易出错。
- AsyncTask: 轻量级的异步类,封装了 Thread 和 Handler,简化了后台任务和 UI 更新的逻辑,但在 Android 8.0 (Oreo) 后被废弃,不推荐在新项目中使用。
- HandlerThread: 拥有自己的 Looper 的线程,适合处理顺序执行的任务。
- Executor (线程池): 现代 Android 开发推荐的方式,通过
Executors创建线程池,管理线程的生命周期,避免频繁创建和销毁线程。 - RxJava / Kotlin Coroutines: 更高级的异步编程框架,可以更优雅地处理复杂的异步逻辑链。
网络请求
- HttpURLConnection: Java 自带,轻量级,但使用起来比较繁琐。
- OkHttp: 目前最流行的网络请求库,高效、简洁,支持异步请求、拦截器等高级功能。
- Volley: Google 推出的库,适合数据量不大、但网络请求频繁的场景,内存缓存效果好。
- Retrofit: 强烈推荐,基于 OkHttp,通过注解(如
@GET,@POST)将网络请求接口定义成 Java 接口,自动生成实现,代码极其简洁,易于维护,是目前 Android 网络请求的事实标准。
第六部分:权限管理
从 Android 6.0 (Marshmallow) 开始,引入了运行时权限机制,除了在 AndroidManifest.xml 中声明权限外,对于一些敏感权限(如相机、位置、联系人),应用必须在运行时向用户请求授权。
-
清单权限: 在
AndroidManifest.xml中声明。
(图片来源网络,侵删) -
运行时权限: 在代码中动态请求。
// 检查是否有权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 没有权限,请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA); } else { // 有权限,执行操作 openCamera(); } // 处理用户授权结果 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_CAMERA) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { openCamera(); } else { // 用户拒绝了权限 Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show(); } } }
学习路径建议
- 环境熟悉: 先学会创建、运行、调试一个 "Hello World" 项目,熟悉 Android Studio 的基本操作。
- 掌握 UI 和 Activity: 学会使用 XML 布局,理解 Activity 的生命周期,并通过点击事件改变 UI,这是最基础也是最常用的。
- 学习数据存储: 从
SharedPreferences开始,了解如何保存和读取简单的配置信息。 - 深入网络和线程: 理解主线程和 ANR 的概念,学习使用
Executor或Retrofit+ OkHttp 进行网络请求,并确保在后台线程执行。 - 学习其他组件: 逐步了解 Service, BroadcastReceiver 的使用场景和实现方式。
- 进阶: 学习 Jetpack 组件(如 ViewModel, LiveData, Room),它们是现代 Android 开发的基石,能帮你更好地构建健壮、可维护的应用。
这份基础涵盖了 Android Java 开发的核心,打好这些基础,你就能开始构建功能完整的 Android 应用了,祝你学习顺利!
