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

时间:2012-12-20 11:02:45

标签: android android-activity stack

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

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

3 个答案:

答案 0 :(得分:2)

我很惊讶这个(某种)问题是多么不受欢迎。

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

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

在所有活动扩展它的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和正确的导航来完成 但是有一个用例,我认为应该是常见的,我只是通过使用意图标志来找不到解决方案。

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

请注意,ChildActivityB也有抽屉。我可以通过抽屉导航到ActivityA,而不是按向上或向后按钮。现在,想象一下你循环这样的过程:活动A - &gt; ChildActivity B - &gt;抽屉 - &gt;活动A - &gt; ChildActivityB - &gt;抽屉 - &gt;活动A ..... 将在后台堆叠中创建无限活动 要解决此类问题,我们需要使用Intent Flags:

(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);

到目前为止一切顺利。 但是,我使用overridePendingTransition()创建了自定义活动转换动画。我注意到,如果我将上述意图标记与overridePendingTransition()一起放在动画中会出现故障,因为活动在动画中间被破坏,因为标志{{ 1}}。

现在,如果我能够检测到Intent.FLAG_ACTIVITY_CLEAR_TOP是否在后台堆叠中,那么行为将是完美的:

ActivityA

答案 1 :(得分:0)

查看ActivityManager API

要获取ActivityManager的实例,请使用以下代码:

ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );

答案 2 :(得分:0)

您可以在特定类的onCreate()onDestory()内,或者在ActivityLifecycleCallbacks的onActivityCreated()onActivityDestroyed()内,将全局变量切换为指示符。

例如:

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
          if (activity instanceof YourActivity) {
              myGlobalData.setActExist(true);
          } 
      }

      @Override
      public void onActivityDestroyed(Activity activity) {
          if (activity instanceof YourActivity) {
              myGlobalData.setActExist(false);
          }
      }
  });
相关问题