由于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后,它会自动退出并返回到调用该设置的应用程序。能够做到这一点是理想的,但我不能解决它。
谢谢!
答案 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)