以编程方式隐藏来自最近的应用

时间:2018-06-07 15:10:44

标签: 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
            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());

这种效果相当不错,但是当按下任务按钮时却没有,而不适用于API 19(我定位)

第二种方法:退出活动: 在网络上找到的第一个解决方案。

public class RemoveFromRecentsActivity extends ApplicationLayer {
    @Override protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        if(android.os.Build.VERSION.SDK_INT >= 21)
        {
            finishAndRemoveTask();
        }
        else
        {
            finish();
        }
    }

    public static void exitApplicationAndRemoveFromRecent(Context context)
    {
        Intent intent = new Intent(context, RemoveFromRecentsActivity.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK  | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_ANIMATION);

        context.startActivity(intent);
    }
}

这不起作用,因为我没有从onPause()调用它,所以它会在应用程序进入后台后执行;我确定这一点,因为它在下次点击图标或从最近恢复时启动虚拟活动。

第三种方法:在第一项活动(Splash)中使用startActivity()覆盖excludeFromRecents="true"

所以基本上我是一个扩展AppCompatActivity的活动,我的所有活动都扩展了它。我已覆盖startActivity()

@Override
    public void startActivity(Intent intent) {
        if (isUserOptIn){
            if (intent.getComponent().getShortClassName().equals(HomepageActivity.class.getName())){
                intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            }
        } 
        super.startActivity(intent);
    }

这里我尝试在启动活动上设置excludeFromRecents="true",但如果用户选择使用该功能,则应该在将用户带到主页之前创建新任务,但不起作用。无论如何,应用程序都会从​​最近删除。

第四种方法:在第一项活动(Splash)中使用startActivity()覆盖excludeFromRecents="false"

@Override
        public void startActivity(Intent intent) {
            if (!isUserOptIn){

                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            }
            super.startActivity(intent);
        }

在这里我做了相反的事情,Splash in维持在最近,并且EXCLUDE_FROM_RECENTS被添加到每个新活动,但它不起作用。当用户未选择加入时,应用程序不会从最近删除。我还尝试intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);认为该应用未被删除,因为第一项活动有excludeFromRecents="false"但也没有。

第五种方法:在第一项活动(Splash)中使用startActivity()覆盖excludeFromRecents="true"

if (! isUserOptIn){
            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS );
        }
        if (intent.getComponent().getShortClassName().equals(HomepageActivity.class.getName())){
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );
            }

我在Splash中设置excludeFromRecents="true"并尝试在打开HomeActivity时创建新任务,无论用户选择如何,并在必要时为每个活动添加FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS。这样,应用程序始终被删除。如果我设置excludeFromRecents="false",结果相反,它始终保持不变。

似乎intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );它根本不起作用。

任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

如果要将应用程序置于后台,Android会调用onUserLeaveHint(),因为用户按下了HOME或TASK按钮。您可以在该方法中设置标志。 Android接下来会调用onPause(),您可以在其中检查标记,如果设置了标记,您可以立即拨打finishAndRemoveTask()

您应该在所有活动中(或从您派生所有其他活动的基础活动中)实施此行为。

注意:这仅适用于API 21及更高版本

对于API&lt;你可以用这样的东西模拟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);

在根onCreate()的{​​{1}}开头(ACTION = MAIN和CATEGORY = LAUNCHER的那个),请执行以下操作:

Activity