如何检查 Activity 是否仍在堆栈中?

2023-11-26

检查活动是否仍在堆栈中以便将其回调的更好方法是什么?

Intent i = new Intent(getApplicationContext(),MyClass.class);
startActivity(i);

我很惊讶这个(某种)问题如此不受欢迎。

我先从解决方案开始:
Since ActivityManager.getRunningTasks自 API 21 起已弃用,
我们必须找到另一种方法来获取后台堆栈中的活动。我意识到我们实际上可以实现我们自己的“堆栈”!

我在 MyOwnApplication 中声明了一个 ArrayList:

private ArrayList<Class> runningActivities = new ArrayList<>();

并添加了公共方法来访问和修改此列表:

public void addThisActivityToRunningActivityies (Class cls) {
    if (!runningActivities.contains(cls)) runningActivities.add(cls);
}

public void removeThisActivityFromRunningActivities (Class cls) {
    if (runningActivities.contains(cls)) runningActivities.remove(cls);
}

public boolean isActivityInBackStack (Class cls) {
    return runningActivities.contains(cls);
}

In a BaseActivity所有活动都扩展它:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((MyOwnApplication)getApplication()).addThisActivityToRunningActivityies(this.getClass());
    }

@Override
protected void onDestroy() {
    super.onDestroy();
    ((MyOwnApplication)getApplication()).removeThisActivityFromRunningActivities(this.getClass());
}

然后你就可以轻松使用isActivityInBackStack去检查。

为什么这是必要的?

是的,当然,大多数情况可以通过使用意图标志和正确的导航来完成。
但有这样一个用例,我认为这应该是常见的,我无法简单地通过使用意图标志找到解决方案。

假设我有一个应用程序,几乎每个活动都有一个导航抽屉。
我从MainActivity to ActivityA,然后创建ChildActivityB from ActivityA。请注意ActivityA不是 的父级ChildActivityB since ChildActivityB可以从通知等其他活动中打开。

注意,ChildActivityB还有一个抽屉。我可以导航到ActivityA通过抽屉,而不是按向上或后退按钮。现在,想象一下您循环执行这样的过程: Activity A -> ChildActivity B -> Drawer -> Activity A -> ChildActivityB -> Drawer -> Activity A ..... 将在后台堆栈中创建无限的活动。
为了修复这种行为,我们需要使用意图标志:

(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);

到目前为止,一切都很好。 但是,我通过使用自定义活动转换动画overridePendingTransition()。我注意到,如果我将上述意图标志与overridePendingTransition(), 动画中会出现故障,因为 Activity 在动画中间被破坏,由于标志Intent.FLAG_ACTIVITY_CLEAR_TOP.

现在,如果我能够检测到是否ActivityA无论是否在后台堆栈中,行为都将是完美的:

private void navigateToDrawerItems(Class cls) {
    drawerLayout.closeDrawer(GravityCompat.END);
    Intent intent = new Intent(this, cls);
    if (((MyOwnApplication)getApplication()).isActivityInBackStack(cls)) {
        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    } else {
        startActivity(intent);
        overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 Activity 是否仍在堆栈中? 的相关文章

随机推荐