Android中的事件传递机制
基本流程:Activity –>ViewGroup–>View–>ViewGroup–>Activity
注意:分发过程中false/true都可以拦截事件,super让事件保持从外到内传递,消耗过程中false/super可以保持事件的从内到外的传递,但是super可以保持视图原有的基本监听(点击、长按)处理,消耗过程中返回true表示拦截事件。
ViewGroup的特殊传递方法onIterceptTouchEvent,可以决定事件是被布局消耗还是给孩子先消耗true表示自己处理,false表示将事件先给孩子
动态权限申请流程
1.检测是否授权
注意:分发过程中false/true都可以拦截事件,super让事件保持从外到内传递,消耗过程中false/super可以保持事件的从内到外的传递,但是super可以保持视图原有的基本监听(点击、长按)处理,消耗过程中返回true表示拦截事件。
ViewGroup的特殊传递方法onIterceptTouchEvent,可以决定事件是被布局消耗还是给孩子先消耗true表示自己处理,false表示将事件先给孩子
2、申请授权
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
3、处理授权结果
在Activity中重写onRequestPermissionsResult
//授权结果@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
//用户拒绝
//检测是否有必要跟用户说明为什么要申请这个权限,如果拒绝了会有什么结果
if (ActivityCompat.shouldShowRequestPermissionRationale(WelcomeActivity.this, permissions[0])) {
//解释一下
AlertDialog.Builder b = new AlertDialog.Builder(WelcomeActivity.this);
b.setTitle("警告")
.setMessage("不授权将影响应用的正常使用,是否需要重新授权?")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(WelcomeActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
}
}).setNegativeButton("否", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) { finish();
}
});
b.show();
}
} else {
toMainActivity();
}
}