3.5 KiB
3.5 KiB
进程与线程
目录
进程概念
进程定义
// 进程:程序执行的基本单位
// - 有独立的内存空间
// - 进程间相互独立
// - 进程间通信复杂
Android 进程
// Android 进程类型:
// 1. 前台进程(Foreground)
// 2. 可见进程(Visible)
// 3. 服务进程(Service)
// 4. 后台进程(Background)
// 5. 空进程(Empty)
线程概念
线程定义
// 线程:CPU 调度的基本单位
// - 共享进程的内存空间
// - 线程间通信简单
// - 线程切换开销小
Android 线程
// Android 线程:
// 1. 主线程(UI 线程)
// 2. 工作线程(后台线程)
进程间通信
IPC 方式
// 1. Binder:Android 主要 IPC 方式
// 2. AIDL:基于 Binder
// 3. Messenger:基于 Binder
// 4. ContentProvider:基于 Binder
// 5. Socket:网络通信
// 6. 文件共享:简单但不安全
Binder IPC
// Binder:Android 主要 IPC 机制
// - 高性能
// - 安全性好
// - 一次拷贝
线程间通信
通信方式
// 1. Handler:主线程和子线程通信
Handler handler = new Handler(Looper.getMainLooper());
handler.post(() -> {
// 主线程执行
});
// 2. AsyncTask:已废弃
// 3. 协程:Kotlin 推荐
lifecycleScope.launch {
val result = withContext(Dispatchers.IO) {
// 后台执行
}
// 主线程更新 UI
}
// 4. 共享变量:需要同步
private volatile boolean flag = false;
进程优先级
优先级类型
// 1. FOREGROUND_SERVICE:前台服务
// 2. VISIBLE:可见进程
// 3. SERVICE:服务进程
// 4. BACKGROUND:后台进程
// 5. EMPTY:空进程
进程回收
// 系统按优先级回收进程
// 优先级低的进程先被回收
// 释放内存给优先级高的进程
进程保活
保活方式
// 1. 前台服务
startForeground(1, notification);
// 2. 双进程守护
// 两个进程互相守护
// 3. JobScheduler
JobInfo jobInfo = new JobInfo.Builder(1, componentName)
.setPeriodic(15 * 60 * 1000)
.build();
// 4. WorkManager
WorkRequest workRequest = new PeriodicWorkRequest.Builder(
MyWorker.class, 15, TimeUnit.MINUTES).build();
WorkManager.getInstance(context).enqueue(workRequest);
注意事项
// ❌ 不推荐:过度保活
// 1. 影响用户体验
// 2. 消耗电量
// 3. 可能被系统杀死
// ✅ 推荐:合理使用
// 1. 使用前台服务(重要任务)
// 2. 使用 JobScheduler(定时任务)
// 3. 使用 WorkManager(后台任务)
面试常见问题
Q1: 进程和线程的区别?
答案:
- 进程:程序执行的基本单位,有独立内存空间
- 线程:CPU 调度的基本单位,共享进程内存空间
Q2: Android 进程间通信方式?
答案:
- Binder(主要方式)
- AIDL
- Messenger
- ContentProvider
- Socket
Q3: 线程间通信方式?
答案:
- Handler
- 协程
- 共享变量(需要同步)
Q4: 进程保活方式?
答案:
- 前台服务
- 双进程守护
- JobScheduler
- WorkManager
最后更新:2024年