【问题标题】:Android - How to detect the final Activity in the stackAndroid - 如何检测堆栈中的最终活动
【发布时间】:2015-04-16 03:09:46
【问题描述】:

我使用下面的代码检查Activity 中的最终Fragment 以弹出对话框

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Check if there is only one fragment
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
                DlgUniversalError.shallIQuit(this, getApplicationContext()
                        .getResources().getString(R.string.doYouWantToQuit),
                        getSupportFragmentManager());
                return false;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

现在假设我有一组Activitys。无论Activity 是堆栈中的最后一个,我如何对Activity 执行相同的操作,然后弹出退出对话框?

【问题讨论】:

标签: android android-activity android-lifecycle back-stack android-task


【解决方案1】:

假设您有活动 1,2,3 ...,它们的流程是:

Activity 1 -> Activity 2 -> Activity 3 -> ... and so on

您真正拥有的唯一选择是在您的 Activity 1 中覆盖 onBackPressed() 方法,如下所示:

@Override
public void onBackPressed(){

    /* Call the Quit Dialog here. If user presses YES,
     * call super.onBackPressed(), else if user presses NO,
     * do nothing. */

}

Fragment backstack 是应用程序本地的,而 Activity backstack 是 task 本地的。现在有几种方法可以检查当前任务的Activity backstack 的状态:

1.说你的Activity流量是

A1 -> A2 -> A3 -> A1 -> A2 -> A3 -> A1 ...

可以确保Activity 1 总是从一个空的backstack 开始。每次以 startActivity() 开头 Activity 1 时,使用 FLAG_ACTIVITY_CLEAR_TOP 标志调用它:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2. 有一个名为isTaskRoot() 的方法可以让您知道Activity 是否是该任务中的第一个Activity,即该任务的后台堆栈上的最后一个Activity。这看起来很有希望。

3. 事实证明,还有另一种方法可以确定 Activity 是否是 backstack 中的最后一个:

    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())) {
        /* do whatever you want e.g. super.onBackPressed() etc. */
    }

为此,将android.permission.GET_TASKS 权限添加到您的清单。

所以... :)

【讨论】:

  • 是的......那是正确的......怎么样:Activity 1 -&gt; Activity 2 -&gt; Activity 3 -&gt; Activity 1-&gt; Activity 3
  • 我使用了与您在第一条评论中建议的不同的导航设计......与我的问题相比,这是一个很好的用户模式......感谢您提供信息!
  • getRunningTasks 现已弃用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多