Activity切换监听(系统级APP)

发布时间:2026/6/27 1:33:09

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、自定义全局弹窗监听不到

相关新闻