Android 从 Android 设置导航回应用程序

Geo*_*cks 11 android android-navigation android-settings

由于 android 从 Android 设置导航回来的方式,我的用户体验不一致。

在我的应用程序中,用户需要授予我的应用程序访问权限ACTION_USAGE_ACCESS_SETTINGS,我通过以下方式访问:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

在为我的应用程序将设置切换为打开后,我需要用户返回到我的应用程序。据我所知,这样做的唯一方法是让他们按下手机上的后退按钮(很想知道是否可以在切换设置后自动返回!!!?!)。

现在将发生两件事之一:

1) 用户最近没有使用android设置,所以它没有打开(即在打开的应用程序抽屉中打开)。第一次按下后退按钮将根据需要将它们带到我的应用程序。

2) 用户最近使用过安卓设置。因此设置已经在应用程序抽屉中打开。现在,当用户按下返回键时,Android 会将他们带回他们最近使用过的每个设置页面(即后退按钮带他们查看他们在 android 设置页面中的历史记录)。可能需要按 2、3 或 4 次后退按钮才能离开 Android 设置并返回到我的应用程序。这显然是糟糕的 UI/UX,我想知道是否有更好的方法?

我注意到在安装 Google 应用程序时,将设置切换为 ON 后,它会自动退出并返回到调用该设置的应用程序。能够做到这一点是理想的,但我无法解决。

谢谢!

Geo*_*cks 7

好吧,在尝试了数百万件事之后,我想出了 3 种不同的方法来改善我的问题。

1)由@CommonsWare提供,通过删除FLAG_ACTIVITY_NEW_TASK,它可以防止所需的后退次数不一致,并且意味着每次用户只需按后退两次。

2)经过对标志的进一步研究,我发现结合使用三个:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

将所需的后推次数减少为 1 次后推。这简单合理,用户友好。

3) 在设置意图触发后,使用处理程序持续检查所需的权限。这看起来有点像黑客,我不敢相信没有更好的方法来做到这一点,但它的工作原理与使用 Google 应用程序时的工作原理完全相同。即,一旦您将开关切换到打开位置,它就会退出 Android 设置页面,并返回到您上次中断的应用程序。我在用:

Handler handler = new Handler();

Runnable checkSettingOn = new Runnable() {

    @Override
    //@TargetApi(23)
    public void run() {
        Log.d(TAG, "run: 1");
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            Log.d(TAG, "run: 2");
            return;
        }
        if (isAccessGranted()) {
            Log.d(TAG, "run: 3");
            //You have the permission, re-launch MainActivity
            Intent i = new Intent(MainActivity.this, MainActivity.class);
            Log.d(TAG, "run: 4");
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(i);
            return;
        }
        handler.postDelayed(this, 200);
    }
};
Run Code Online (Sandbox Code Playgroud)

然后,当您触发意图进入 Android 设置页面时,请确保启动处理程序:

handler.postDelayed(checkSettingOn, 1000);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助其他遇到类似问题的人。