Android API 21-22获取任务栈顶层Activity实现页面跳转合规校验
低版本适配方案
方案1:直接补全else分支(适配API21-22)
注意事项
getRunningTasks在API21后被标记为废弃,但API21-22版本仍可正常返回当前应用的任务栈信息,仅访问自身应用任务栈时不需要额外申请权限- 仅可用于判断当前应用自身的Activity栈状态,无法获取其他应用的栈信息
完整代码
ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Activity.ACTIVITY_SERVICE); List<ActivityManager.AppTask> appTasks = activityManager.getAppTasks(); ActivityManager.RecentTaskInfo taskInfo = appTasks.get(0).getTaskInfo(); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { ComponentName topActivity = taskInfo.topActivity; if (topActivity.getClassName().contains(MainActivity.class.getSimpleName())) { // start activity A } } else { // 适配API21-22逻辑 List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(1); if (runningTasks != null && !runningTasks.isEmpty()) { ComponentName topActivity = runningTasks.get(0).topActivity; if (topActivity != null && topActivity.getClassName().contains(MainActivity.class.getSimpleName())) { // start activity A } } }
方案2:全局生命周期回调(更稳定,全版本通用)
该方案不依赖系统API版本兼容性,也不需要任何权限,适配所有Android版本,更推荐使用:
实现步骤
- 自定义Application类,维护栈顶Activity引用
public class MyApp extends Application { private Activity currentTopActivity; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityResumed(@NonNull Activity activity) { currentTopActivity = activity; } @Override public void onActivityPaused(@NonNull Activity activity) { if (currentTopActivity == activity) { currentTopActivity = null; } } // 其他生命周期方法空实现即可 @Override public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(@NonNull Activity activity) {} @Override public void onActivityStopped(@NonNull Activity activity) {} @Override public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {} @Override public void onActivityDestroyed(@NonNull Activity activity) {} }); } public boolean isMainActivityOnTop() { return currentTopActivity instanceof MainActivity; } }
- 原来的校验逻辑直接调用该方法即可,不需要区分版本:
if (((MyApp) mContext.getApplicationContext()).isMainActivityOnTop()) { // start activity A }
内容的提问来源于stack exchange,提问作者Anastasiya
相关产品推荐
相关产品推荐

