当前位置: 首页 > news >正文

Android监听运行应用的任务变化包含Activity及Service

文章目录

  • 第一种方案
    • 简介
    • 定义与作用
    • 应用场景
    • 代码实现
  • 第二种方案
    • 简介
    • 代码实现
  • 测试
  • 相关文章

想监听安卓系统中每个应用的运行变化,比如运行到前台,或者退出,或者某个Activity前后台的变化。
使用IActivityManager或IActivityTaskManager这两个都可以实现监听任务运行变化。

第一种方案

简介

IActivityManager是 Android 系统中的一个重要接口,这里主要是使用它实现监听任务变化的。
它与ActivityManagerService,ActivityThread联系很紧密。

应用进程 ActivityManagerProxy ActivityManagerService (AMS) 系统服务进程 ActivityThread 调用 IActivityManager 方法(如 startActivity) 通过 IPC 调用相应方法 AMS 处理请求,如创建 ActivityRecord 等 发送消息启动 Activity ActivityThread 接收到消息, 创建 Activity 实例并执行生命周期方法 返回 Activity 启动结果 返回处理结果 返回结果给应用进程 应用进程 ActivityManagerProxy ActivityManagerService (AMS) 系统服务进程 ActivityThread

定义与作用

IActivityManager是 Android 系统中用于管理活动(Activity)、任务(Task)和应用程序进程等的接口。它提供了一系列方法,允许系统和应用程序之间进行交互,以实现对活动生命周期的管理、任务的操作以及进程的控制等功能。通过这个接口,系统可以协调不同应用程序之间的交互,确保用户界面的流畅切换和多任务处理的高效进行。

应用场景

  1. 系统层面
    当用户在主屏幕上点击一个应用图标时,系统会通过IActivityManager来启动该应用的主活动,创建相应的任务栈,并将活动显示在屏幕上。
    系统的多任务管理界面也是通过IActivityManager来获取当前运行的任务列表,以及对任务进行切换、关闭等操作。
  2. 应用程序层面
    应用内进行活动跳转时,实际上也是通过IActivityManager来实现的。例如,一个社交应用从聊天列表界面跳转到具体的聊天详情界面,就是通过IActivityManager来启动相应的聊天详情活动。
    应用程序在某些情况下可能需要主动杀死自己的后台进程,或者检测系统中其他应用的进程状态等,这些都可以通过IActivityManager提供的方法来实现。

代码实现

如果直接引用IActivityManager是会报错的
错误: 找不到符号IActivityManager,如下图
在这里插入图片描述

需要引入framework.jar

  1. 工程根目录下创建jar目录,并放入Android SDK编译生成的framework.jar
  2. app/buiod.gradle中引入framework.jar
    implementation fileTree(dir: "libs", include: ["*.jar"])compileOnly files('../jar/framework.jar')

这样代码中就可以引用到IActivityManager了,如下图
在这里插入图片描述
3. 使用registerProcessObserver注册回调监听

代码如下

import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.app.IProcessObserver;
import android.content.Context;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;public class AppStackManager {private static final String TAG = "AppStackManager";private IActivityManager mIActivityManager;public void registerProcessObserver() {Log.d(TAG, "registerProcessObserver");if (mIActivityManager == null) {mIActivityManager = ActivityManagerNative.asInterface(ServiceManager.getService(Context.ACTIVITY_SERVICE));}try {// 需要权限<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" />mIActivityManager.registerProcessObserver(new IProcessObserver.Stub() {@Overridepublic void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) throws RemoteException {Log.d(TAG, "onForegroundActivitiesChanged: " + pid + " " + uid + " " + foregroundActivities);}@Overridepublic void onForegroundServicesChanged(int i, int i1, int i2) throws RemoteException {Log.d(TAG, "onForegroundServicesChanged: " + i + " " + i1 + " " + i2);}@Overridepublic void onProcessDied(int pid, int uid) throws RemoteException {Log.d(TAG, "onProcessDied: " + pid + " " + uid);}});} catch (Exception e) {e.printStackTrace();}}
}

这种方案获取当前变化的应用的包名不好弄,这里推荐第二种方案。

第二种方案

简介

IActivityTaskManager 是 Android 系统中用于管理任务(Task)和窗口(Window)相关操作的重要接口。这个接口是从 Android 10(API 级别 29)开始引入的。在此之前,与任务和窗口管理相关的功能大多集成在 IActivityManager 中。将任务和窗口管理的功能拆分到 IActivityTaskManager 中,使得系统架构更加清晰,各个模块的职责更加明确,便于维护和扩展。

代码实现

与第一种一样,需要引入framework.jar(这里省略),
使用registerTaskStackListener注册回调进行监听

import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
import android.app.TaskStackListener;
import android.content.Context;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;public class AppStackManager {private static final String TAG = "AppStackManager";private IActivityTaskManager mIActivityTaskManager;public void registerTaskStackListener() {Log.d(TAG, "registerTaskStackListener");if (mIActivityTaskManager == null) {mIActivityTaskManager = ActivityTaskManager.getService();}try {// 需要权限<uses-permission android:name="android.permission.MANAGE_ACTIVITY_TASKS" />mIActivityTaskManager.registerTaskStackListener(new TaskStackListener() {@Overridepublic void onTaskStackChanged() throws RemoteException {super.onTaskStackChanged();Log.d(TAG, "onTaskStackChanged");}@Overridepublic void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) throws RemoteException {super.onTaskMovedToFront(taskInfo);Log.d(TAG, "onTaskMovedToFront: " + taskInfo.baseActivity.flattenToString());Log.d(TAG, "packageName:" + taskInfo.baseActivity.getPackageName());}@Overridepublic void onTaskMovedToBack(ActivityManager.RunningTaskInfo taskInfo) {super.onTaskMovedToBack(taskInfo);Log.d(TAG, "onTaskMoved:" + taskInfo.baseActivity.flattenToString());}});} catch (Exception e) {e.printStackTrace();}}
}

测试

比如在桌面上打开原生设置时,

回调函数中可以正确打印出其变化,如下图
在这里插入图片描述

相关文章

Android监听第三方播放获取音乐信息及包名
Android Framework学习二:Activity创建及View绘制流程
作者:帅得不敢出门

http://www.dtcms.com/a/598034.html

相关文章:

  • 免费网站推荐货源深圳高端家政服务公司
  • MATLAB语言简介
  • 西安个人做网站不记得域名管理网站
  • 常州网站制作企业单位网站建设维护情况报告
  • Java反射完全指南:从入门到精通
  • seo网站推广报价企业系统包括哪些系统
  • 冬日暖居:科学应对暖气病的生活哲学
  • 网站建设的7个基本流程网站下面版权代码
  • 从文字到世界:空间智能是人工智能的下一个前沿
  • 51单片机逆向
  • 网站域名的管理密码如何索取wordpress禁止加载头部
  • Dubbo-学习笔记1
  • 怎样建设个自己的网站首页中信建设有限责任公司电话打不通
  • 无人机信息采集模块技术要点与难点
  • DDR4 4.27 Self refresh Operation
  • 建设工程业绩查询网站专业制作网站有哪些
  • 新闻类网站开发难点wordpress 注册填密码
  • 金耀网站建设秦皇岛建设局长
  • 捕鱼网站开发自学ui设计学什么软件
  • 网站的建设方法有哪些番禺区网站建设公司
  • 响应式编程 | 如何通过响应式编程提升前端开发效率
  • 网站建设北京海淀seo顾问服
  • 网站空间150m游戏推广话术
  • 高端大气的科技网站网站建设专业的公司
  • 蒙文网站建设情况汇报怎么看网站是服务器还是虚拟主机
  • 淘宝网站建设教程视频温岭网站建设制作
  • CANN中MmDeqSwigluQuantMmDeq算子模型的深层解析
  • 03.Python语言中的变量
  • 攻防世界-Misc-can_has_stdio?
  • 新余网站开发公司巩义网站建设方案表