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

Activity切换监听(系统级APP)

系统级APPmanifest xmlns:androidhttp://schemas.android.com/apk/res/android packagecom.xxx.xxx android:sharedUserIdandroid.uid.system方式一TaskStackListener 封装类import android.app.ActivityManager; import android.app.TaskStackListener; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import java.util.List; public class CarTaskStackMonitor { private static final String TAG CarTaskStackMonitor; // 防抖间隔 private static final long DEBOUNCE_TIME 200; private static CarTaskStackMonitor sInstance; private TaskStackListener mTaskStackListener; private OnTopActivityChangedListener mListener; // 记录上一次页面去重 private String mLastTopActivity ; private final Handler mMainHandler new Handler(Looper.getMainLooper()); private final Runnable mFetchTopTaskRunnable this::fetchAndCheckTopActivity; // 单例 public static CarTaskStackMonitor getInstance() { if (sInstance null) { sInstance new CarTaskStackMonitor(); } return sInstance; } private CarTaskStackMonitor() {} // 启动监听 public void startMonitor() { if (mTaskStackListener ! null) { return; } mTaskStackListener new TaskStackListener() { Override public void onTaskStackChanged() { // 防抖移除旧任务延迟执行 mMainHandler.removeCallbacks(mFetchTopTaskRunnable); mMainHandler.postDelayed(mFetchTopTaskRunnable, DEBOUNCE_TIME); } }; try { ActivityManager.getService().registerTaskStackListener(mTaskStackListener); Log.i(TAG, TaskStackListener 注册成功); } catch (Exception e) { Log.e(TAG, 注册失败, e); } } // 停止监听 public void stopMonitor() { try { mMainHandler.removeCallbacks(mFetchTopTaskRunnable); if (mTaskStackListener ! null) { ActivityManager.getService().unregisterTaskStackListener(mTaskStackListener); mTaskStackListener null; } Log.i(TAG, TaskStackListener 已注销); } catch (Exception e) { Log.e(TAG, 注销失败, e); } } // 获取顶层Activity并对比是否变化 private void fetchAndCheckTopActivity() { try { ListActivityManager.RunningTaskInfo taskList ActivityManager.getService().getRunningTasks(1); if (taskList null || taskList.isEmpty()) { return; } ActivityManager.RunningTaskInfo topTask taskList.get(0); String pkgName topTask.topActivity.getPackageName(); String clsName topTask.topActivity.getClassName(); String current pkgName / clsName; // 页面没变化直接return if (TextUtils.equals(current, mLastTopActivity)) { return; } mLastTopActivity current; // 回调外部 if (mListener ! null) { mListener.onTopActivityChanged(pkgName, clsName); } Log.d(TAG, 页面切换 - pkg: pkgName cls: clsName); } catch (Exception e) { Log.e(TAG, 获取顶层Activity异常, e); } } // 回调接口 public interface OnTopActivityChangedListener { void onTopActivityChanged(String packageName, String activityClassName); } public void setOnTopActivityChangedListener(OnTopActivityChangedListener listener) { this.mListener listener; } }必须加的权限AndroidManifest.xmluses-permission android:nameandroid.permission.MANAGE_ACTIVITY_STACKS / uses-permission android:nameandroid.permission.GET_TASKS /方式二import android.app.ActivityManager; import android.content.Context; import android.text.TextUtils; import android.util.Log; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; import java.util.concurrent.TimeUnit; public class YourClass { private static final String TAG TopActivityMonitor; private static final long CHECK_INTERVAL 300; // 轮询间隔 private Disposable checkTopUiDisposable; private String displayTopActivity ; private int restoreCode 0; private void startListenTopActivity() { // 循环监听顶层Activity checkTopUiDisposable Observable.interval(0, CHECK_INTERVAL, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .map(aLong - getTopActivityPackage()) .filter(pkg - !TextUtils.isEmpty(pkg)) .distinctUntilChanged() // 只有变化才回调 .observeOn(AndroidSchedulers.mainThread()) .subscribe(topPackage - { TLog.d(TAG, 顶层Activity变化 topPackage); //TODO }); } private String getTopActivityPackage() { try { ActivityManager activityManager (ActivityManager) App.getContext().getSystemService(Context.ACTIVITY_SERVICE); return activityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); } catch (Exception e) { return ; } } private void stopListenTopActivity() { if (checkTopUiDisposable ! null !checkTopUiDisposable.isDisposed()) { checkTopUiDisposable.dispose(); } } }普通 Activity 跳转、Launcher 桌面切换、普通 App 页面可监听弹窗、悬浮 Window、系统 Dialog、Toast、自定义全局弹窗监听不到

相关文章:

Activity切换监听(系统级APP)

系统级APP<manifestxmlns:android"http://schemas.android.com/apk/res/android"package"com.xxx.xxx"android:sharedUserId"android.uid.system">方式一&#xff1a;TaskStackListener 封装类import android.app.ActivityManager; import…...

Windows网络转发如何配置?netsh命令完整指南

一、什么是Windows网络转发 Windows网络转发指利用Windows系统自带功能&#xff08;如netsh命令、防火墙规则&#xff09;&#xff0c;将访问本机特定端口的流量定向转发到局域网内另一台设备的技术。它相当于“局域网内的流量摆渡车”&#xff0c;让内网设备借助Windows主机实…...

Java后端8年经验跨界AI:收藏这份硬核转型指南,高薪与职业自由唾手可得!

作者分享从8年Java后端工程师跨界至AI应用开发的转型经历&#xff0c;指出当前AI应用开发虽是风口&#xff0c;但已不再是简单调用API就能立足。文章强调后端工程师需具备工程落地能力&#xff0c;掌握RAG、Agent、Prompt等核心技术&#xff0c;并具备解决线上流量、稳定性问题…...

2026十大AI大模型API聚合平台:中小团队降本提效选型全攻略

引文/摘要2026年全球AI大模型API中转服务市场规模已突破300亿美元&#xff0c;年增速超过200%。中小团队在调用多款大模型时&#xff0c;常面临供应商对接繁琐、访问延迟、成本失控、数据合规等难题。AI大模型API聚合平台&#xff08;API Gateway&#xff09; 用一个接口接入多…...

中小团队如何利用Taotoken统一管理多个大模型API调用成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 中小团队如何利用Taotoken统一管理多个大模型API调用成本 对于同时使用多个大语言模型的中小型研发团队而言&#xff0c;账单分散和…...

美团闪购mtgsig

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包 内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;侵权通过头像私信或名字简介叫我删除博…...

基于AI与事件驱动的智能安全运维系统设计与实践

1. 项目概述&#xff1a;一个能自己“思考”并封禁IP的SOC如果你是一名运维或者安全工程师&#xff0c;每天盯着海量的网络日志&#xff0c;手动分析、判断、然后去防火墙加一条条黑名单规则&#xff0c;这种重复且耗时的“救火”工作一定让你头疼不已。NetOps-AI这个项目&…...

Graph-autofusion贡献指南

贡献指南 【免费下载链接】graph-autofusion Graph-autofusion 是一个面向昇腾&#xff08;Ascend&#xff09;芯片的轻量级、解耦式组件集合&#xff0c;旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件&#xff0c;未来将持续开放更多自动融合相关模块。 …...

开源AI技能开发:从SongSee项目看智能体与RPA的音乐处理实践

1. 项目概述&#xff1a;从开源技能库到个人AI助手的进化 最近在折腾AI智能体&#xff08;Agent&#xff09;和RPA&#xff08;机器人流程自动化&#xff09;的时候&#xff0c;发现了一个挺有意思的开源项目&#xff1a; nkchivas/openclaw-skill-songsee 。乍一看这个标题…...

基于Python与MySQL的Telegram农场游戏机器人全栈开发实战

1. 项目概述&#xff1a;一次对经典农场游戏的逆向工程与重生几年前&#xff0c;如果你在Telegram上混迹过&#xff0c;很可能听说过或者沉迷过一款名为FunFarm的机器人游戏。它是一款典型的放置类农场经营游戏&#xff0c;玩家可以播种、等待作物生长、收获、升级农场&#xf…...

基于Astro构建高性能LLM知识库:架构设计与工程实践

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Astro-Han/karpathy-llm-wiki”。光看名字&#xff0c;可能很多朋友会有点懵&#xff0c;这到底是个啥&#xff1f;简单来说&#xff0c;这是一个用Astro框架构建的、专门用来学习和探索Andrej Karp…...

对比直接使用厂商 API 与通过 Taotoken 调用的便捷性差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商 API 与通过 Taotoken 调用的便捷性差异 作为一名个人开发者&#xff0c;我曾直接使用多家模型厂商的原生 API 来…...

互联网大厂Java求职者面试:微服务与云原生的挑战

互联网大厂Java求职者面试&#xff1a;微服务与云原生的挑战 场景&#xff1a;在一家互联网大厂的面试中&#xff0c;面试官是一位严肃的技术专家&#xff0c;而候选人燕双非则是一位幽默风趣的程序员。面试官试图通过一系列问题了解燕双非对微服务和云原生的掌握程度。第一轮提…...

推荐阅读书籍

...

基于MERN栈构建类ChatGPT应用:全栈开发与OpenAI API集成实践

1. 项目概述&#xff1a;从零构建一个类ChatGPT的Web应用最近在技术社区里&#xff0c;关于大语言模型的应用开发讨论得热火朝天。很多开发者都想亲手搭建一个属于自己的对话AI应用&#xff0c;但面对复杂的架构和API调用&#xff0c;往往不知从何下手。今天&#xff0c;我想分…...

可解释AI在衰老时钟模型中的应用:从黑箱预测到生物标志物发现

1. 项目概述&#xff1a;当“黑箱”AI遇见衰老时钟在生物医学研究&#xff0c;尤其是衰老科学这个前沿领域&#xff0c;我们正面临一个既令人兴奋又充满挑战的局面。一方面&#xff0c;以深度学习为代表的复杂机器学习模型&#xff0c;凭借其强大的模式识别能力&#xff0c;正以…...

新手开发者如何通过Taotoken快速体验和对比不同大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 新手开发者如何通过Taotoken快速体验和对比不同大模型 对于刚接触大模型API的开发者而言&#xff0c;面对众多模型提供商、复杂的接…...

基于C#winform实现yolo26-plate中文车牌检测识别支持12种中文双层颜色车牌文字识别

效果展示项目简介 这是一个基于深度学习的车牌检测与识别系统&#xff0c;采用 ONNX 模型格式实现&#xff0c;支持 CPU 和 CUDA 加速推理。本项目将 Python 实现的车牌检测识别功能完整移植到 C# 环境&#xff0c;实现了高性能、模块化的车牌识别解决方案。 算法原理 本系统采…...

Mermaid Live Editor:3个开发阶段,从代码小白到图表专家的进阶之路

Mermaid Live Editor&#xff1a;3个开发阶段&#xff0c;从代码小白到图表专家的进阶之路 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending…...

AzurLaneAutoScript深度解析:智能调度与图像识别的自动化解决方案

AzurLaneAutoScript深度解析&#xff1a;智能调度与图像识别的自动化解决方案 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript …...

魔兽争霸3终极兼容性解决方案:WarcraftHelper完整指南

魔兽争霸3终极兼容性解决方案&#xff1a;WarcraftHelper完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Windows 11上的兼…...

AI模型公平性:从统计定义到工程实践的全面解析

1. 项目概述&#xff1a;为什么我们今天必须严肃讨论AI公平性 几年前&#xff0c;我参与过一个信用评分模型的优化项目。团队用上了当时最先进的梯度提升算法&#xff0c;模型的AUC曲线漂亮得让人惊叹&#xff0c;在测试集上的表现远超旧系统。然而&#xff0c;当模型部署到某个…...

在Windows 11上无缝运行Android应用:Windows Subsystem for Android完整指南

在Windows 11上无缝运行Android应用&#xff1a;Windows Subsystem for Android完整指南 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 想要在Windows电脑上…...

如何查找SQL中最常见的元素_结合GROUP BY与COUNT

用 GROUP BY COUNT 找出现最多的值&#xff1a;先按目标字段分组&#xff0c;再统计每组行数并降序排列取首行&#xff0c;如 SELECT source, COUNT() FROM users GROUP BY source ORDER BY COUNT() DESC LIMIT 1。怎么用 GROUP BY COUNT 找出字段里出现最多的值直接对目标字…...

生成式AI如何重塑创意工作流:实验揭示的人机协作双刃剑效应

1. 项目概述&#xff1a;当AI成为你的“创意副驾驶”最近半年&#xff0c;我身边的设计师、文案、程序员朋友&#xff0c;几乎人手一个AI工具。从Midjourney出图到ChatGPT写方案&#xff0c;从Suno作曲到Runway做视频&#xff0c;大家聊天的开场白从“吃了没”变成了“你prompt…...

无标签数据下的模型评估:SUDO方法与可靠性-完整性曲线实战指南

1. 项目概述&#xff1a;当数据没有“标准答案”时&#xff0c;我们如何评价模型&#xff1f;在机器学习项目的实际落地中&#xff0c;我们常常会陷入一个尴尬的境地&#xff1a;模型训练好了&#xff0c;但用来评估它性能的“黄金标准”测试集&#xff0c;要么不存在&#xff…...

3步快速上手NSC_BUILDER:Switch游戏文件全能管理终极指南

3步快速上手NSC_BUILDER&#xff1a;Switch游戏文件全能管理终极指南 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encry…...

CANN/GE图引擎API-添加数据边

AddDataEdge 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...

CAD2025详细安装教程图文版

一、安装环境建议AutoCAD 2025 建议使用 Windows 10/11 64位系统&#xff0c;电脑配置建议 i5 以上处理器、16GB 以上内存、SSD 固态硬盘&#xff0c;并预留足够磁盘空间。安装前关闭杀毒软件&#xff0c;保持系统组件完整&#xff0c;避免因运行库缺失导致安装失败。二、安装步…...

高阶意识与预测处理理论:AI意识计算的技术实现与评估

1. 意识计算理论&#xff1a;从哲学思辨到工程实现的范式转移在认知科学与人工智能的交汇处&#xff0c;有一个问题长久以来既令人着迷又充满挑战&#xff1a;我们能否在机器中构建意识&#xff1f;这听起来像是科幻小说的主题&#xff0c;但过去二十年间&#xff0c;一系列基于…...