Files
mkdocs/docs/android面试/系统原理/进程与线程.md
2026-01-15 11:53:37 +08:00

3.5 KiB
Raw Permalink Blame History

进程与线程

目录


进程概念

进程定义

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

Android 进程

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

线程概念

线程定义

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

Android 线程

// Android 线程:
// 1. 主线程UI 线程)
// 2. 工作线程(后台线程)

进程间通信

IPC 方式

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

Binder IPC

// BinderAndroid 主要 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 进程间通信方式?

答案:

  1. Binder主要方式
  2. AIDL
  3. Messenger
  4. ContentProvider
  5. Socket

Q3: 线程间通信方式?

答案:

  1. Handler
  2. 协程
  3. 共享变量(需要同步)

Q4: 进程保活方式?

答案:

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

最后更新2024年