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;
}