如何检查活动仍然是在栈?(how to check if activity is still in

2019-07-17 11:34发布

什么是更好的方式来检查活动仍然在堆栈以便它叫回来?

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

Answer 1:

看看ActivityManager API

要获得ActivityManager使用这种代码的实例:

ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );


Answer 2:

我很惊讶这(种)问题(S)是如何不得人心的。

让我从溶液中首先启动:
由于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);
}

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检查。

为什么这个必要吗?

是的,当然,大多数情况下,可以通过使用意图标志和适当的导航完成。
但是,有这样的使用情况下,我认为应该是共同的,那我不要简单地使用意图的标志找到一个解决方案。

假设我有一个在几乎每一个活动的抽屉式导航的应用程序。
我从导航MainActivityActivityA ,然后创建ChildActivityBActivityA 。 请注意, ActivityA不是父ChildActivityB因为ChildActivityB可以从其他活动,如通知被打开。

需要注意的是, ChildActivityB也有一个抽屉。 我可以导航到ActivityA通过抽屉,而不是按上或后退按钮。 现在,通过这样的过程想象你循环:活动A - > ChildActivity乙 - >抽屉 - >活动A - > ChildActivityB - >抽屉 - >活动A .....无限活动将在堆栈中创建的。
要解决这样的行为,我们需要使用意向标志:

(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);

到现在为止还挺好。 但是,我通过使用具有自定义活动过渡动画overridePendingTransition() 我注意到,如果我把上面的意图标志连同overridePendingTransition() 会有动画毛刺,因为活动是在动画中被破坏 ,由于标志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);
    }
}


Answer 3:

您可以切换全局变量作为内部指标onCreate()onDestory()特定类的,或内onActivityCreated()onActivityDestroyed() ActivityLifecycleCallbacks的。

例如:

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


文章来源: how to check if activity is still in the stack?