Android - 如何检测堆栈中最后的 Activity
Android - How to detect the final Activity in the stack
我使用下面的代码检查 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
。无论 Activity
是堆栈中的最后一个,我如何对 Activity
执行相同的操作,并弹出退出对话框?
假设您有活动 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
后台堆栈是应用程序本地的,而 Activity
后台堆栈是 task 本地的。现在有几种方法可以检查当前任务的 Activity
后台堆栈的状态:
1. 说你的 Activity
流量是
A1 -> A2 -> A3 -> A1 -> A2 -> A3 -> A1 ...
可以确保 Activity 1
始终以空的后台堆栈开始。每次用 startActivity()
, call it with the FLAG_ACTIVITY_CLEAR_TOP
标志开始 Activity 1
时:
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
是否是后栈中的最后一个:
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
中的最终 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
。无论 Activity
是堆栈中的最后一个,我如何对 Activity
执行相同的操作,并弹出退出对话框?
假设您有活动 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
后台堆栈是应用程序本地的,而 Activity
后台堆栈是 task 本地的。现在有几种方法可以检查当前任务的 Activity
后台堆栈的状态:
1. 说你的 Activity
流量是
A1 -> A2 -> A3 -> A1 -> A2 -> A3 -> A1 ...
可以确保 Activity 1
始终以空的后台堆栈开始。每次用 startActivity()
, call it with the FLAG_ACTIVITY_CLEAR_TOP
标志开始 Activity 1
时:
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
是否是后栈中的最后一个:
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
权限。
那么……:)