Android 以编程方式从最近的应用程序中隐藏应用程序
我想在用户按下“主页”或“任务”按钮时以编程方式隐藏我的应用程序。用户可以决定应用程序是否在后台持久,此设置来自后端,因此在最近的任何情况下都不会维护预登录活动。我尝试了各种各样的解决方案,有些部分有效,但没有一种效果完美。我将列出我使用的所有方法 第一种方法。手动任务删除: 删除每个任务并终止进程Android 以编程方式从最近的应用程序中隐藏应用程序,android,android-activity,background,task,home-button,Android,Android Activity,Background,Task,Home Button,我想在用户按下“主页”或“任务”按钮时以编程方式隐藏我的应用程序。用户可以决定应用程序是否在后台持久,此设置来自后端,因此在最近的任何情况下都不会维护预登录活动。我尝试了各种各样的解决方案,有些部分有效,但没有一种效果完美。我将列出我使用的所有方法 第一种方法。手动任务删除: 删除每个任务并终止进程 //remove the app from recents. TODO doesn't remove if app list button is pressed instead of home
//remove the app from recents. TODO doesn't remove if app list button is pressed instead of home
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ActivityManager am = (ActivityManager) application.getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
List<ActivityManager.AppTask> tasks = am.getAppTasks();
if (tasks != null && !tasks.isEmpty()) {
tasks.get(0).setExcludeFromRecents(true);
}
}
} else {
//TODO API 19
}
//kills the process
android.os.Process.killProcess(android.os.Process.myPid());
这不起作用,因为我不是从onPause()
调用它,所以它会在应用程序进入后台后执行;我确信这一点,因为它会在我下次单击图标或从最近恢复时启动虚拟活动
第三种方法:在第一个活动(飞溅)中使用excludeFromRecents=“true”
覆盖startActivity()
所以基本上我有一个活动扩展了AppCompatActivity
,我的所有活动都扩展了它。我已经覆盖了startActivity()
:
在这里,我尝试在splash活动上设置excludeFromRecents=“true”
,但是如果用户选择使用该功能,则在将用户带到主页之前应该创建一个新任务,但该任务不起作用。无论如何,应用程序都会从最近的应用程序中删除
第四种方法:在第一个活动(飞溅)中使用excludeFromRecents=“false”
覆盖startActivity()
在这里,我做了相反的事情,最近维护的Splash in和从最近排除的Splash in被添加到每个新活动中,但它不起作用。当用户尚未选择加入时,应用程序不会从最近的应用程序中删除。我还尝试了intent.addFlags(intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | intent.FLAG_ACTIVITY_CLEAR_TASK | intent.FLAG_ACTIVITY_NEW_TASK |
认为应用程序没有被删除,因为第一个活动具有excludeFromRecents=“false”
,但也不起作用
第五种方法:在第一个活动(Splash)中使用excludeFromRecents=“true”
覆盖startActivity()
在这里,我在Splash中设置了excludeFromRecents=“true”
,并尝试在打开HomeActivity时创建一个新任务,而不考虑用户的选择,并在必要时向每个活动添加FLAG\u ACTIVITY\u EXCLUDE\u FROM\u RECENTS
。这样,应用程序总是被删除。相反的结果如果我设置了excludeFromRecents=“false”
,它总是保持不变
它看起来像intent.addFlags(intent.FLAG_ACTIVITY_CLEAR_TASK | intent.FLAG_ACTIVITY_NEW_TASK)代码>它根本不起作用
有人知道如何实现这一点吗?如果由于用户按下了“主页”或“任务”按钮而将应用程序置于后台,Android将调用onUserLeaveHint()
。您可以在该方法中设置标志。Android将下一次调用onPause()
,您可以在其中检查标志,如果设置了标志,您可以立即调用finishAndRemoveTask()
您应该在所有活动(或派生所有其他活动的基础活动)中实现此行为
注:这仅适用于API 21及更高版本
对于API<21,您可能可以使用以下内容模拟finishAndRemoveTask()
:
不要调用finishAndRemoveTask()
,而是执行以下操作:
Intent clearIntent = new Intent(this, MyRootActivity.class);
clearIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
clearIntent.putExtra("exit", true);
startActivity(clearIntent);
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// finish immediately
finish();
return;
}
在根活动的onCreate()
的一开始(ACTION=MAIN,CATEGORY=LAUNCHER),执行以下操作:
Intent clearIntent = new Intent(this, MyRootActivity.class);
clearIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
clearIntent.putExtra("exit", true);
startActivity(clearIntent);
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// finish immediately
finish();
return;
}
谢谢我来看看。但我需要一个API 19的方式。嗨,再次感谢编辑。我刚刚尝试实现onUserLeaveHint,但它不仅在用户选择离开应用程序(如文档中所述)时被调用,而且在创建新活动时也被调用。由于无法区分实际用户操作和新活动的开始,因此这看起来不是一种可行的方法。我试图了解我是否可以使用覆盖startActivity和StartActivityForResult的标志,但这会给整个应用带来很大的风险,所以我不确定。用问题中的方法真的没有办法做到吗?啊…那太糟糕了。我看不出还有别的办法。我现在已经设法使用了你的方法。仍然存在一些问题:1)onUserLeaveHint当用户锁定手机时,手机不会被呼叫。2) 在API 19上,当用户按下home按钮或recents按钮时,应用程序立即进入后台,没有时间开始结束活动,因此它不会从recents中删除(该方法在调试时工作,因此存在计时问题)。我已经设法绕过了#1,但#2似乎没有解决方案。仍然不理解为什么intent.addFlags(intent.FLAG_ACTIVITY_CLEAR_TASK | intent.FLAG_ACTIVITY_NEW_TASK)代码>不起作用,这应该是最简单的方法。。。。
Intent clearIntent = new Intent(this, MyRootActivity.class);
clearIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
clearIntent.putExtra("exit", true);
startActivity(clearIntent);
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// finish immediately
finish();
return;
}