安卓(android)开发从入门到精通,学习笔记
- Android
- 2023-05-15
- 1500热度
- 0评论
开发者指南:https://developer.android.google.cn/guide
API文档:https://developer.android.google.cn/reference/packages
应用基础知识
1.安卓应用
每个 Android 应用都处于各自的安全沙盒中,并受以下 Android 安全功能的保护:
- Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
- 每个进程都拥有自己的虚拟机 (VM),因此应用代码独立于其他应用而运行。默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。
2.应用组件
应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入您的应用。有些组件会依赖于其他组件。共有四种不同的应用组件类型:
- Activity(Activities)
- 服务(Services)
- 广播接收器(Broadcast receivers)
- 内容提供程序(Content providers)
2.1 Activity
Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕。 一个应用可以拥有多个activity
相关文档:https://developer.android.google.cn/reference/android/app/Activity
相关代码:
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState); /* 在第一次创建活动时调用 */
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
生命周期的相关说明:
- onCreate(),在第一次创建活动时调用。这是您应该进行所有常规静态设置的地方:创建视图、将数据绑定到列表等,后一个生命周期为onStart()
- onRestart(),Activity 停止后,在它再次启动之前调用。后一个生命周期为onStart()
- onStart(),当活动对用户可见时调用。后一个什么周期为onResume()或者onStop()
- ...
2.2 Services
Services是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业,服务不提供界面。它的核心价值是 “在后台持续提供服务”,主要分为以下几类场景:
1. 执行后台长期任务(无界面、不中断)
这是 Service 最基础的作用,用于处理那些即使应用界面关闭(Activity 销毁),也需要继续执行的任务:
- 音频 / 视频后台播放(比如音乐 APP 切到后台仍播放);
- 大文件下载 / 上传(比如网盘 APP 后台下载文件);
- 实时数据同步(比如聊天 APP 后台同步消息);
- 定位追踪(比如导航 APP 后台定位)。
2. 为其他组件提供数据 / 功能支持
- Service 可以作为 “后台服务端”,为应用内的 Activity、Fragment 等组件提供持续的功能支持:
- 比如一个天气 APP,Service 后台定时请求天气数据,Activity 随时可以从 Service 获取最新数据;
- 比如一个计算型应用,Service 后台处理复杂计算,Activity 只需接收计算结果。
3. 跨进程提供服务(AIDL)
- 通过 AIDL(Android Interface Definition Language),Service 可以向其他应用提供跨进程的服务:
- 比如系统的 “闹钟服务”“通知服务”,都是系统级 Service,第三方应用可以绑定并使用;
- 比如多个应用共享同一个数据处理服务,通过绑定 Service 实现数据互通。
虽然 Service 是后台任务的核心,但安卓不同版本对后台服务的限制越来越严格(比如 Android 8.0+ 后台 Service 容易被系统杀死),需根据场景选择更合适的方案:
- IntentService:已过时(推荐用 WorkManager),是 Service 的子类,自动在子线程处理任务,任务完成后自动停止;
- WorkManager:适合处理 “延迟执行、周期性执行、需要保证执行” 的后台任务(比如定时同步数据),兼容所有安卓版本,自动适配系统限制;
- ForegroundService(前台服务):需要显示通知的后台服务(比如音乐播放、导航),系统优先级更高,不易被杀死;
- Coroutine/Thread:简单的短期后台任务(比如单次网络请求),直接用协程 / 线程即可,无需启动 Service。
官方文档:https://developer.android.google.cn/reference/android/app/Service
3.安卓中的 Uri
Uri(Uniform Resource Identifier),中文叫统一资源标识符,本质上是安卓系统中用来唯一标识和定位资源的字符串。标准 Uri 遵循固定格式,完整结构如下:
scheme://authority/path?query#fragment
android.net.Uri 是安卓系统提供的专门用于处理 Uri 字符串的工具类,它的核心使命是:
- 规范地构建符合标准的 Uri 字符串(避免手动拼接出错);
- 便捷地解析已有的 Uri 字符串(提取其中的 scheme、path、参数等);
- 提供安全、高效的 Uri 操作方法,替代易出错的字符串手动处理。
简单说:Uri 概念是 “资源地址”,Uri 类是操作这个 “地址” 的 “工具箱”。
官方文档:https://developer.android.com/reference/android/net/Uri
4.Intent 是什么?
Intent(中文:意图)是安卓系统中组件间通信的核心媒介,可以把它理解成:
- 生活中:一张 “任务通知单”,包含 “要做什么”“给谁做”“需要什么材料”;
- 开发中:一个封装了 “操作意图” 的对象,用于在Activity、Service、BroadcastReceiver 这三大组件之间传递消息、触发操作。
Intent 是安卓组件之间 “对话” 的语言,比如 Activity A 想打开 Activity B,就需要通过 Intent 告诉系统 “我要打开 B”;应用想播放音乐,就通过 Intent 告诉 Service “请播放 XX 音乐”。
// 1. 创建隐式 Intent,指定“动作(查看)”+“数据(网页 Uri)”
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
// 2. 启动(系统会匹配所有支持 ACTION_VIEW + http 协议的组件,比如浏览器)
startActivity(intent)
Intent 不仅能 “触发操作”,还能作为 “数据载体”,在组件间传递各种类型的数据(基本类型、对象、Uri 等):
- 基本类型:String、int、boolean 等(通过 putExtra());
- 复杂对象:实现 Serializable 或 Parcelable 接口的自定义类;
- 资源标识:Uri(比如图片 Uri、文件 Uri,结合之前讲的 Uri 知识点)。
官方文档:https://developer.android.com/guide/components/intents-filters?hl=zh-cn
