Android:动态权限请求设计模式

我在android编程方面很新颖。 我想问一下关于startActivityForResult()ActivityCompat.requestPermissions()函数及其设计。 我知道这些函数的结果是分别由另一个Activity函数( onActivityResult()onRequestPermissionsResult() )处理的。 但我不明白为什么这样设计。

尤其是使用ActivityCompat.requestPermissions() 。 为什么我必须控制是否有权限( ContextCompat.checkSelfPermission() ),如果我没有要求它( ActivityCompat.requestPermissions() )。 如果我得到这个许可,然后处理完全不同的function?

我希望有这样的想法:

 askPermission(Context context, String permission, Runnable permissionGranted, Runnable permissionDenied) 

如果我已经有权限,或者如果我从用户那里得到它,它将调用permissionGranted。 有了这个function,我将不得不关心,如果我有权限,或者我没有它。

现在,我必须distonguish如果我有权限,然后做同步任务,或者我没有它,然后在onRequestPermissionsResult() ,我经常做同样的,如果我已经有权限做的“异步”任务。

我的问题是:是否有一些原因,为什么这样设计的权限? 有没有一些function,我上面写了让我只是说如果我有什么做什么,如果我没有权限(以function的方式)做什么? 还是有一些设计模式,以便于处理权限和结果的启动活动?

感谢您的时间和一些解释,如果你知道为什么这个设计很好。

绝对不是一个好方法!

如果我们使用inheritance概念,我们可以稍微解决这个问题

我们可以使它像这样同步:

 //Kotlin askForPermissions(permissionList, onPermissionsGranted = { //If permissions given }, onPermissionFailed = { //If permissions not given }) 

购买使用inheritance:

 //Kotlin open class PermissionActivity : AppCompatActivity() { private val PERM_REQ_CODE = 1457 private lateinit var onPermissionsGranted: () -> Unit; private lateinit var onPermissionFailed: () -> Unit; private lateinit var perms: Array internal fun askForPermissions(perms: Array, onPermissionsGranted: () -> Unit, onPermissionFailed: () -> Unit) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkIfOneNotHasPermission(perms)) { //Dont have permissions this.perms = perms this.onPermissionsGranted = onPermissionsGranted this.onPermissionFailed = onPermissionFailed requestPermissions(perms, PERM_REQ_CODE) } } else { onPermissionsGranted.invoke() } } @RequiresApi(Build.VERSION_CODES.M) private fun checkIfOneNotHasPermission(perms: Array): Boolean { perms.forEach { if (checkSelfPermission(it) != PackageManager.PERMISSION_GRANTED) { return true } } return false } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { when (requestCode) { PERM_REQ_CODE -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkIfOneNotHasPermission(perms)) { onPermissionFailed.invoke() } else { onPermissionsGranted.invoke() } } else { onPermissionsGranted.invoke() } } else -> { onPermissionFailed.invoke() } } } }