Android - AMS WMS PMS三大服务的底层原理

181 阅读3分钟

三大服务的基本内容

1. 整体关系图

graph TD
    A[SystemServer] --> B[AMS活动管理]
    A --> C[WMS窗口管理]
    A --> D[PMS包管理]
    
    B --> B1[Activity管理]
    B --> B2[进程管理]
    B --> B3[服务管理]
    
    C --> C1[窗口显示]
    C --> C2[输入事件]
    C --> C3[动画管理]
    
    D --> D1[应用安装]
    D --> D2[权限管理]
    D --> D3[包信息]

2. ActivityManagerService (AMS)

2.1 主要职责
class ActivityManagerService {
    /**
     * 1. Activity管理
     * - 启动Activity
     * - 管理Activity栈
     * - 处理Activity生命周期
     */
    fun startActivity() {
        // 检查权限
        checkPermission()
        // 查找目标Activity
        resolveActivity()
        // 创建或复用进程
        startProcess()
        // 调度Activity启动
        scheduleLaunch()
    }

    /**
     * 2. 进程管理
     * - 创建进程
     * - 进程优先级
     * - 进程回收
     */
    fun processManagement() {
        // 进程创建
        createProcess()
        // 设置优先级
        setPriority()
        // 内存管理
        manageMemory()
    }
}
2.2 使用示例
class AMSExample {
    fun startActivityExample() {
        // 启动Activity
        startActivity(Intent(this, NextActivity::class.java))
        
        // 后台实际调用AMS
        // 1. 权限检查
        // 2. 进程创建(如需)
        // 3. Activity生命周期管理
    }
    
    fun processExample() {
        // 获取运行中的进程信息
        val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        val runningProcesses = activityManager.runningAppProcesses
    }
}

3. WindowManagerService (WMS)

3.1 主要职责
class WindowManagerService {
    /**
     * 1. 窗口管理
     * - 窗口添加/删除
     * - 窗口层级管理
     * - 窗口动画
     */
    fun windowManagement() {
        // 添加窗口
        addWindow()
        // 更新窗口
        updateWindow()
        // 移除窗口
        removeWindow()
    }

    /**
     * 2. 输入事件分发
     * - 触摸事件
     * - 按键事件
     */
    fun inputDispatch() {
        // 接收输入事件
        handleInput()
        // 分发到目标窗口
        dispatchToWindow()
    }
}
3.2 使用示例
class WMSExample : Activity() {
    fun windowExample() {
        // 获取WindowManager
        val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
        
        // 添加悬浮窗
        val params = WindowManager.LayoutParams().apply {
            type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
            flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        }
        
        val view = LayoutInflater.from(this).inflate(R.layout.float_window, null)
        windowManager.addView(view, params)
    }
}

4. PackageManagerService (PMS)

4.1 主要职责
class PackageManagerService {
    /**
     * 1. 应用管理
     * - 安装应用
     * - 卸载应用
     * - 更新应用
     */
    fun packageManagement() {
        // 安装应用
        installPackage()
        // 解析清单文件
        parseManifest()
        // 权限授予
        grantPermissions()
    }

    /**
     * 2. 权限管理
     * - 权限检查
     * - 权限授予
     */
    fun permissionManagement() {
        // 检查权限
        checkPermission()
        // 请求权限
        requestPermission()
    }
}
4.2 使用示例
class PMSExample {
    fun packageExample() {
        // 获取PackageManager
        val packageManager = context.packageManager
        
        // 获取应用信息
        val packageInfo = packageManager.getPackageInfo(
            context.packageName, 
            PackageManager.GET_ACTIVITIES
        )
        
        // 安装APK
        val intent = Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(apkUri, "application/vnd.android.package-archive")
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
        }
        startActivity(intent)
    }
    
    fun permissionExample() {
        // 检查权限
        if (checkSelfPermission(Manifest.permission.CAMERA) 
            == PackageManager.PERMISSION_GRANTED) {
            // 使用相机
        } else {
            // 请求权限
            requestPermissions(arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA)
        }
    }
}

5. 三者协作示例

class SystemServiceCooperation {
    fun launchCameraExample() {
        // 1. PMS检查权限
        if (checkCameraPermission()) {
            // 2. AMS启动相机Activity
            startCameraActivity()
            
            // 3. WMS处理窗口显示
            handleWindowDisplay()
        }
    }
    
    private fun checkCameraPermission(): Boolean {
        // PMS权限检查
        return context.checkSelfPermission(Manifest.permission.CAMERA) == 
            PackageManager.PERMISSION_GRANTED
    }
    
    private fun startCameraActivity() {
        // AMS处理Activity启动
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivity(intent)
    }
    
    private fun handleWindowDisplay() {
        // WMS处理窗口显示
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

6. 工作流程图

sequenceDiagram
    participant App as 应用程序
    participant AMS as ActivityManagerService
    participant WMS as WindowManagerService
    participant PMS as PackageManagerService
    
    App->>PMS: 1. 检查权限
    PMS-->>App: 返回权限状态
    
    App->>AMS: 2. 启动Activity
    AMS->>PMS: 3. 验证组件信息
    PMS-->>AMS: 返回验证结果
    
    AMS->>WMS: 4. 创建窗口
    WMS->>WMS: 5. 管理窗口层级
    WMS-->>App: 6. 显示界面

7. 注意事项

  1. AMS注意点
// 1. 避免ANR
// 2. 合理管理进程优先级
// 3. 注意Activity栈管理
  1. WMS注意点
// 1. 窗口层级管理
// 2. 性能优化
// 3. 输入事件处理
  1. PMS注意点
// 1. 权限管理
// 2. 安装包大小
// 3. 签名验证

通过以上讲解,我们可以看到:

  1. AMS主要负责四大组件的管理和进程管理
  2. WMS主要负责窗口显示和输入事件处理
  3. PMS主要负责应用安装和权限管理

这三个服务相互配合,共同保证了Android系统的正常运行。

9.实际应用示例 🌟

/**
 * 实际应用场景
 */
class PracticalUsage {
    /**
     * 1. Activity管理
     */
    fun activityManagement() {
        // 启动Activity
        startActivity(Intent().apply {
            setClass(this@MainActivity, SecondActivity::class.java)
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
        })
        
        // 任务管理
        moveTaskToFront()
        
        // 结束Activity
        finishActivity()
    }
    
    /**
     * 2. 窗口处理
     */
    fun windowHandling() {
        // 添加悬浮窗
        windowManager.addView(floatingView, params)
        
        // 更新窗口
        windowManager.updateViewLayout(view, params)
        
        // 设置全屏
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
        )
    }
    
    /**
     * 3. 权限处理
     */
    fun permissionHandling() {
        // 检查权限
        if (checkSelfPermission(permission) == PERMISSION_GRANTED) {
            // 执行操作
        }
        
        // 请求权限
        requestPermissions(permissions, REQUEST_CODE)
        
        // 安装APK
        installPackage(apkUri)
    }
}

10.性能优化 ⚡

总结一下:

  1. AMS(前台接待):

    • 管理Activity生命周期
    • 处理任务栈
    • 进程管理
  2. WMS(展示管理):

    • 窗口布局
    • 输入事件分发
    • 显示内容管理
  3. PMS(安保系统):

    • 应用安装卸载
    • 权限管理
    • 包信息管理

使用建议:

  • 理解系统机制
  • 合理使用API
  • 注意性能优化
  • 做好异常处理