判断进程是否是主进程
函数定义
private fun isMainProcess(application: Application): Boolean {
val pid = Process.myPid()
val currentProcess = application.getSystemService(ActivityManager::class.java)
?.runningAppProcesses?.firstOrNull { it.pid == pid }
return application.packageName == currentProcess?.processName
}
这段 Kotlin 代码定义了一个用于判断 当前进程是否是主进程(main process) 的函数 isMainProcess,在 Android 开发中非常常用,尤其是在多进程场景下,比如:某些初始化操作只在主进程中执行。
逐行解释
val pid = Process.myPid()
获取当前进程的 进程 ID(PID)。
val currentProcess = application.getSystemService(ActivityManager::class.java)
?.runningAppProcesses?.firstOrNull { it.pid == pid }
获取系统服务 ActivityManager;
从 runningAppProcesses 中找到与当前 PID 匹配的 RunningAppProcessInfo 对象;
这个对象中包含进程的名称、PID、UID 等信息。
return application.packageName == currentProcess?.processName
判断当前进程的 processName 是否和 application.packageName 一致;
如果一致,说明当前是 主进程,返回 true;
否则不是主进程,返回 false。
为什么需要这个判断?
Android 应用可能会运行在多个进程中(例如通过 android:process 指定了非默认进程),但是:
有些初始化代码(如 SDK 初始化、资源加载、服务注册)只应在主进程中执行,否则会造成冗余或异常。
举例:常见使用场景
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (isMainProcess(this)) {
// 初始化 SDK、设置全局配置等操作
}
}
}
总结
这个 isMainProcess 函数:
- 是多进程场景下判断是否处于主进程的常规写法;
- 避免在非主进程中重复执行初始化逻辑;
- 判断依据是:当前进程名是否与 applicationId 一致。