我想知道如果用户退出当前活动是否会返回主屏幕。
我想知道如果用户退出当前活动是否会返回主屏幕。
Answers:
更新(2015年7月):
由于getRunningTasks()已弃用,因此从API 21开始,最好遵循raukodraug 答案或Ed Burnette的 一个(我希望第二个)。
可以使用ActivityManager检查当前任务及其堆栈。
因此,要确定一项活动是否为最后一项活动:
使用以下代码:
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元素。阅读有关任务的更多信息任务和Back Stack
isTaskRoot()
方法以正确的方式进行操作。
if (isTaskRoot()) { // do something }
希望这对新手有帮助。根据以上对我来说很有效的答案,我也共享代码段,以使其易于实现。
解决方案:如果当前活动仅是您堆栈中的活动,并且我还处理其他情况(如果我在堆栈中有一些活动,则转到堆栈中的最后一个活动而不是打开新的自定义活动),则使用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();
}
}
有一个最简单的解决方案,您可以 在活动中使用isTaskRoot()
尽管可能有一种方法可以做到这一点(请参阅其他答案),但我建议您不要这样做。普通的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")
sandrstar解决方案使用的问题ActivityManager
是:您需要获得许可才能以这种方式获取任务。我找到了一个更好的方法:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
在Activity
上堆栈底部应该得到百达这一类在默认情况下,而其他活动不应该得到它。
但是,即使在某些设备上失败,您也可以在启动时进行设置Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
我为我的所有活动创建了一个基类,扩展了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); }
}
到目前为止,这已经足够好了。而不管API版本如何。当然,这要求所有活动都扩展此基类-就我而言,它们就是这样做的。
编辑:我注意到一个实例,当计数器在应用程序完全退出之前下降到零时,这是当方向改变并且只有一个活动处于打开状态时。当方向更改时,活动被关闭并创建了另一个活动,因此onDestroyed
上一个活动onCreate
被调用,然后在使用更改的方向创建相同的活动时被调用。这种行为必须予以考虑;可以使用OrientationEventListener。
Android实现了一个Activity栈,建议您在此处阅读。您似乎想要做的只是检索调用活动:getCallingActivity()
。如果当前活动是您应用程序中的第一个活动,并且该应用程序是从主屏幕启动的,则它应该(我假设)返回null
。