rau*_*aug 151

对于有类似问题的人,我将发布@ H9kDroid的评论作为最佳答案.

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

我希望这有帮助

  • @TheHunter`if(isTaskRoot()){//做某事}` (17认同)
  • 唯一的问题是,在<= 4.4时,我发现它的行为与> = 5.x不同.它似乎总是返回虚假. (3认同)

san*_*tar 108

更新(2015年7月):

由于getRunningTasks()得到过时,从API 21这是更好地遵循raukodraug 答案埃德伯内特 一个(我宁愿第二个).


可以使用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");
    }
    
    Run Code Online (Sandbox Code Playgroud)

请注意,上述代码仅在您有单个任务时才有效.如果您的应用程序可能存在多个任务 - 您需要检查其他taskList元素.阅读有关任务任务和后台堆栈的更多信息


  • H9kDroid提出了正确的建议.选定的答案是黑客.应该使用`isTaskRoot()`方法以正确的方式完成它. (24认同)
  • getRunningTasks() 在 API 级别 21 中已弃用。 (2认同)

小智 15

有一个最简单的解决方案,你可以 在你的活动中使用isTaskRoot()


Abh*_*arg 7

希望这对新手有帮助。根据以上对我来说很有效的答案,我也共享代码段,以使其易于实现。

解决方案:如果当前活动仅是您堆栈中的活动,并且我还处理如果堆栈中有一些活动则转到堆栈中的最后一个活动而不是打开新的自定义活动的情况,那么我将使用isTaskRoot()此方法返回true

在您的活动中

   @Override
    public void onBackPressed() {

        if(isTaskRoot()){
            startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
            // using finish() is optional, use it if you do not want to keep currentActivity in stack
            finish();
        }else{
            super.onBackPressed();
        }

    }
Run Code Online (Sandbox Code Playgroud)


H9k*_*oid 5

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

每当您开始一项新活动时,请插入标记:

newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
Run Code Online (Sandbox Code Playgroud)

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

boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Run Code Online (Sandbox Code Playgroud)


Ed *_*tte 5

虽然可能有办法实现这一点(见其他答案),但我建议你不要这样做.普通的Android应用程序不需要知道主屏幕是否即将显示.

如果您正在尝试保存数据,请将数据保存代码放在onPause()方法中.如果您试图让用户改变他们对现有应用程序的看法,您可以截取Back键和onBackPressed()方法的向上/向下键,并向他们显示"你确定吗?" 提示.

  • 如果后台服务启动一个 Activity,也许您想知道它是否是堆栈中唯一的 Activity。 (2认同)