看来,没有办法观察这个设置,所以实际上没有优雅的解决方案。
您可以执行的操作是将用户发送到设置屏幕后,使用Handler每秒检查一次设置。
您不能从设置屏幕以编程方式真正地“返回”,因此唯一的选择是重新启动活动并清除以前的活动(否则它会在后退按回到设置屏幕) 。
下面的例子中,在启用设置的一秒内,它将重新启动MainActivity。
首先定义了Runnable:
Handler handler = new Handler();
Runnable checkOverlaySetting = new Runnable() {
@Override
@TargetApi(23)
public void run() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
if (Settings.canDrawOverlays(MainActivity.this)) {
//You have the permission, re-launch MainActivity
Intent i = new Intent(MainActivity.this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
return;
}
handler.postDelayed(this, 1000);
}
};
然后开始了Runnable当您发送用户设置屏幕:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
//Add this here:
handler.postDelayed(checkOverlaySetting, 1000);
请注意,您应该设置超时或最大努力使之如果用户没有启用覆盖设置,它将不会永远持续。
无论你想做什么,你都可以在onActivityResult()方法中做到。检查resultCode是否等于Activity.RESULT_OK,然后做任何你想做的事情。 –
对不起,我错过了原始问题中的一些单词。我可以根据结果做些东西,但是我要做的是让它自动返回到活动状态,而无需用户按下。 –