# 进程与线程

## 目录
- [进程概念](#进程概念)
- [线程概念](#线程概念)
- [进程间通信](#进程间通信)
- [线程间通信](#线程间通信)
- [进程优先级](#进程优先级)
- [进程保活](#进程保活)
- [面试常见问题](#面试常见问题)

---

## 进程概念

### 进程定义

```java
// 进程：程序执行的基本单位
// - 有独立的内存空间
// - 进程间相互独立
// - 进程间通信复杂
```

### Android 进程

```java
// Android 进程类型：
// 1. 前台进程（Foreground）
// 2. 可见进程（Visible）
// 3. 服务进程（Service）
// 4. 后台进程（Background）
// 5. 空进程（Empty）
```

---

## 线程概念

### 线程定义

```java
// 线程：CPU 调度的基本单位
// - 共享进程的内存空间
// - 线程间通信简单
// - 线程切换开销小
```

### Android 线程

```java
// Android 线程：
// 1. 主线程（UI 线程）
// 2. 工作线程（后台线程）
```

---

## 进程间通信

### IPC 方式

```java
// 1. Binder：Android 主要 IPC 方式
// 2. AIDL：基于 Binder
// 3. Messenger：基于 Binder
// 4. ContentProvider：基于 Binder
// 5. Socket：网络通信
// 6. 文件共享：简单但不安全
```

### Binder IPC

```java
// Binder：Android 主要 IPC 机制
// - 高性能
// - 安全性好
// - 一次拷贝
```

---

## 线程间通信

### 通信方式

```java
// 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;
```

---

## 进程优先级

### 优先级类型

```java
// 1. FOREGROUND_SERVICE：前台服务
// 2. VISIBLE：可见进程
// 3. SERVICE：服务进程
// 4. BACKGROUND：后台进程
// 5. EMPTY：空进程
```

### 进程回收

```java
// 系统按优先级回收进程
// 优先级低的进程先被回收
// 释放内存给优先级高的进程
```

---

## 进程保活

### 保活方式

```java
// 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);
```

### 注意事项

```java
// ❌ 不推荐：过度保活
// 1. 影响用户体验
// 2. 消耗电量
// 3. 可能被系统杀死

// ✅ 推荐：合理使用
// 1. 使用前台服务（重要任务）
// 2. 使用 JobScheduler（定时任务）
// 3. 使用 WorkManager（后台任务）
```

---

## 面试常见问题

### Q1: 进程和线程的区别？

**答案：**
- **进程**：程序执行的基本单位，有独立内存空间
- **线程**：CPU 调度的基本单位，共享进程内存空间

### Q2: Android 进程间通信方式？

**答案：**
1. Binder（主要方式）
2. AIDL
3. Messenger
4. ContentProvider
5. Socket

### Q3: 线程间通信方式？

**答案：**
1. Handler
2. 协程
3. 共享变量（需要同步）

### Q4: 进程保活方式？

**答案：**
1. 前台服务
2. 双进程守护
3. JobScheduler
4. WorkManager

---

*最后更新：2024年*
