1

当用户按下主页或任务按钮时,我想以编程方式隐藏我的应用程序。用户可以决定应用程序是否在后台持续存在,此设置来自后端,因此在任何一种情况下都不会维护登录前活动。我尝试了各种解决方案,有些可以部分工作,但没有一个可以完美工作。我将列出我使用的所有方法。

第一种方法。手动删除任务: 删除所有任务并杀死进程

//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(我的目标)时

第二种方法: ExitActivity:在网上找到的第一个解决方案。

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(),所以它在应用程序进入后台后执行;我确信这一点,因为它会在我下次单击该图标或从最近恢复它时启动虚拟活动。

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

所以基本上我有一个扩展的活动,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 Activity,但是如果用户选择了使用该功能,则在将用户带到主页之前应该创建一个新任务,但不起作用。无论如何,应用程序都会从​​最近删除。

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

@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"但也没有工作。

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

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

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

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

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

4

1 回答 1

1

onUserLeaveHint()如果由于用户按下了 HOME 或 TASK 按钮而将应用程序置于后台,Android 将调用。您可以在该方法中设置标志。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);

onCreate()在您的根目录的最开始Activity(具有 ACTION=MAIN 和 CATEGORY=LAUNCHER 的那个),执行以下操作:

Intent intent = getIntent();
if (intent.hasExtra("exit")) {
    // finish immediately
   finish();
   return;
}
于 2018-06-07T15:49:01.233 回答