Android从Android设置导航回应用

时间:2017-11-23 00:09:26

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

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

现在将发生以下两件事之一:

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

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

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

谢谢!

6 个答案:

答案 0 :(得分:1)

你可以在这做一件事。您必须确认您只打开需要打开的设置组件....不要打开主设置应用程序。在您想要的设置应用中仅打开一个组件。因此,当您按下时,您将跳回到您的应用程序。

  

例如,如果我想在设置中打开蓝牙设置   应用程序,我不会打开主设置应用程序,而是我将打开   只有设置的蓝牙组件。以这种方式,当我按回我   将返回我自己的应用程序,因为我没有打开主设置应用程序,所以我不需要在其中导航。

ComponentName cn = new ComponentName("com.android.settings", 
                   "com.android.settings.bluetooth.BluetoothSettings");

答案 1 :(得分:1)

启动“设置”活动后,您可以运行定期任务,即每次调用,例如500毫秒,并检查是否授予了权限。
使用标记singleTask / singleInstance标记您的设置活动,如果已授予权限,则启动它。现有的活动实例将移至顶部。

我为通知访问权限做了这个。

答案 2 :(得分:1)

好的,所以在尝试了数百万件事之后,我想出了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);

减少了单次背压所需的背压次数。这是简单合理的用户友好。

3)使用处理程序在触发设置意图后连续检查所需的权限。这似乎有点像黑客,我无法相信没有更好的方法来做到这一点,但它的工作原理与使用Google App时的工作方式完全相同。即,只要您将切换开关打开,它就会退出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);
    }
};

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

handler.postDelayed(checkSettingOn, 1000);

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

答案 3 :(得分:0)

您必须确认只打开需要打开的应用设置。不要打开主设置应用程序。只打开您想要的应用设置。因此,只要您按下该按钮,就会跳回到您的应用程序。

Uri uri = Uri.fromParts("package", getPackageName(), null);
Intent intent = new Intent();                            
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(uri);
startActivity(intent);

答案 4 :(得分:0)

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent);

这也是最简单的导航方式

答案 5 :(得分:0)

根据 Ufkoku 的回答,我定期检查权限状态。为了让用户回来,我使用了 startActivityForResult 和 finishActivity。

示例代码:我将其用于“USAGE_ACCESS_SETTINGS”。

var intent = Intent("android.settings.USAGE_ACCESS_SETTINGS")
intent.data = Uri.fromParts("package", "com.example.app", null)
startActivityForResult(intent,101)

var timer = Timer(true)
timer.scheduleAtFixedRate(object: TimerTask(){
    override fun run(){
        if(checkUsageAccessPermission()){ // checkUsageAccessPermission() is a helper function
            finishActivity(101)
            cancel()                    
        }
    }
}, 0, 1000)