如何检查活动是否是应用程序活动堆栈中的最后一个?

我想知道如果用户退出当前活动,将返回到主屏幕。

有可能使用ActivityManager检查当前的任务和他们的堆栈。

所以,要确定一个活动是否是最后一个:

  • 在清单中请求android.permission.GET_TASKS权限。
  • 使用下面的代码:

    ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE ); List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10); if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) { Log.i(TAG, "This is last activity in the stack"); } 

请注意,上述代码只有在您有单一任务的情况下才有效。 如果您的应用程序有可能存在多个任务 – 您需要检查其他taskList元素。 阅读更多关于任务任务和返回堆栈

更新(2015年7月):

由于getRunningTasks()被弃用,API 21最好遵循raukodraug的 答案或埃德· 布内特 (我更喜欢第二个)。

我打算发表@ H9kDroid的评论,作为有类似问题的人的最佳答案。

您可以使用isTaskRoot来了解活动是否是任务的根。

我希望这有帮助

有一个最简单的解决scheme,你可以在你的activity中使用isTaskRoot()

虽然可能有办法做到这一点(见其他答案)我build议你不应该这样做。 正常的Android应用程序不需要知道主屏幕是否即将显示。

如果您尝试保存数据,请将数据保存代码放入onPause()方法中。 如果您想让用户改变他们对现有应用程序的想法,您可以截取Back键和onBackPressed()方法的键,并将其显示为“您确定吗? 提示。

跟踪这种情况的一种方法是在开始新活动时包括一个标记,并检查标记是否存在。

每当你开始一个新的活动,插入标记:

 newIntent=new Intent(this, NextOne.class); newIntent.putExtra(this.getPackageName()+"myself", 0); startActivity(newIntent); 

然后你可以像这样检查它:

 boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself") 

使用ActivityManager sandrstar解决scheme的问题是:您需要获得以这种方式获取任务的权限。 我find了一个更好的方法:

 getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) 

堆栈底部的Activity应该默认为这个类别,而其他Activity不应该得到它。
但即使在某些设备上失败,您也可以在开始Activity

 Intent intent = new Intent(startingActivity, SomeActivityClass.class); intent.addCategory(Intent.CATEGORY_LAUNCHER); activity.startActivity(intent); 

我为我的所有活动创build了一个基类,扩展了AppCompatActivity ,并且有一个静态计数器:

 public abstract class BasicActivity extends AppCompatActivity { private static int activityCounter = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ++activityCounter; ... } @Override public void onDestroy() { super.onDestroy(); --activityCounter; if(activityCounter==0) { // Last instance code... } } public boolean isLastInstance() { return (activityCounter==1); } } 

到目前为止,这已经运行得很好。 而不pipeAPI版本。 当然,所有的活动都要求扩展这个基类,就我们而言,他们是这样做的。

编辑:我注意到一个实例,当应用程序完全退出之前,计数器下降到零,这是当方向改变,只有一个活动是打开的。 当方向改变时,活动被closures,另一个被创build,所以onDestroyed被调用的最后一个活动,然后onCreate被称为当改变的方向创build相同的活动。 这种行为必须考虑在内; OrientationEventListener可能被使用。

Android实现了一个Activity堆栈,我build议你在这里阅读。 它看起来像所有你想要做的,虽然是检索调用活动: getCallingActivity() 。 如果当前活动是应用程序中的第一个活动,并且应用程序是从主屏幕启动的,它应该(我假设)返回null

在这里错过的一件事就是“主键”点击,激活时,你不能从你的活动中检测到这一点,所以最好通过编程方式控制活动栈,处理“返回键”按下并移动到所需的活动或只是做必要的步骤。

另外,您不能确定从“最近的活动”列表开始您的活动,可以检测到一些额外的数据意图用于开放活动,因为它在这种情况下被重用。