Android - 如何检测堆栈中的最终活动
Posted
技术标签:
【中文标题】Android - 如何检测堆栈中的最终活动【英文标题】:Android - How to detect the final Activity in the stack 【发布时间】: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);
现在假设我有一组Activity
s。无论Activity
是堆栈中的最后一个,我如何对Activity
执行相同的操作,然后弹出退出对话框?
【问题讨论】:
我不确定我是否理解这个问题,但它让我想到了这一点:Activity#isTaskRoot() 【参考方案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 -> Activity 2 -> Activity 3 -> Activity 1-> Activity 3
我使用了与您在第一条评论中建议的不同的导航设计......与我的问题相比,这是一个很好的用户模式......感谢您提供信息!
getRunningTasks
现已弃用。以上是关于Android - 如何检测堆栈中的最终活动的主要内容,如果未能解决你的问题,请参考以下文章
Android Activity Stack 未按文档中的说明工作 - 未显示任务堆栈中的最后一个活动