观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

版权声明

本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17283985.html

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

前言

  ActivityTaskManager,实现应用进程和运行在系统进程的 ActivityTaskManagerService 的通信; 可以通过它对后台任务RecentsActivity的实现一部分的功能。 另外个人刚接触这部分代码,此博客是暂时以记录功能的形式。并没有检验一些方法的实际功能。

  个人体验部分功能,例如清除堆栈的功能还是不错的,可以配合用activityManager.killBackgroundProcesses来实现一键加速的功能。 另外查看堆栈信息也可以检测应用使用情况。

  另外注意,此功能需要架framework包也需要系统级权限与系统签名

代码

/**
 * 删除所有可见的近期任务
 */
fun removeAllVisibleRecentTasks() {
    ActivityTaskManager.getService().removeAllVisibleRecentTasks()
}

/**
 * 删除目标包名后台任务
 */
fun removeTask(context: Context, packageName: String) {
    val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    val runningTaskInfoList = activityManager.getRunningTasks(Int.MAX_VALUE)
    for (item in runningTaskInfoList) {
        if (item.topActivity.packageName == packageName) {
            val taskId = item.id
            ActivityTaskManager.getService().removeTask(taskId)
            ActivityTaskManager.getService().removeStack(taskId)
            break
        }
    }
}

/**
 * 删除activity的后台任务
 */
fun removeTask(activity: Activity) {
    ActivityTaskManager.getService().removeTask(activity.taskId)
    ActivityTaskManager.getService().removeStack(activity.taskId)
}

/**
 * 获取当前在前台运行应用的包名
 */
fun getCurrentRunPackageName(): String? {
    val am: IActivityManager =
        ActivityManagerNative.asInterface(ServiceManager.getService("activity"))
    try {
        val cn: ComponentName = am.getTasks(1).get(0).topActivity
        return cn.getPackageName()
    } catch (e: RemoteException) {
        e.printStackTrace()
        Log.e("lwlx", "获取当前在前台运行应用的包名失败")
        return null
    }
}

 

posted on 2023-04-03 18:27  观心静  阅读(1294)  评论(0编辑  收藏  举报