gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:21 25 4
gpt4 key购买 nike

检查 Activity 是否仍在堆栈中以便回调它的更好方法是什么?

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

最佳答案

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

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

我在 MyOwnApplication 中声明了一个 ArrayList:

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

并添加了访问和修改此列表的公共(public)方法:

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);
}

在所有 Activity 扩展它的 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 进行检查。

为什么这是必要的?

是的,当然,大多数情况下可以通过使用 Intent Flags 和适当的导航来完成。
但是有这样一个用例,我认为应该很常见,我没有找到仅通过使用 Intent 标志的解决方案。

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

请注意,ChildActivityB 也有一个抽屉。我可以通过抽屉导航到 ActivityA,而不用按向上或向后按钮。现在,假设您循环执行这样的过程:Activity A -> ChildActivity B -> Drawer -> Activity A -> ChildActivityB -> Drawer -> Activity A .....无限 Activity 将在后台创建。
要修复此类行为,我们需要使用 Intent Flags:

(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);

到目前为止一切顺利。但是,我使用 overridePendingTransition() 自定义了 Activity 转换动画。我注意到,如果我将上述 Intent 标志与 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);
}
}

关于android - 如何检查 Activity 是否仍在堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com