前言
Fragment,简称碎片,可以简单地认为它就是一个“控件”,更加具体一点就是“View控制器”。它自身有生命周期。在开发中,我们经常用到,再熟悉不过了。然而,Fragment 的一些巧妙引用,不知道你是否了解过?
- 使用 Fragment 封装权限申请
- 使用 Fragment 优雅处理 onActivityResult
- Activity reCreate 的时候用来存储数据
这篇文章主要讲解以下内容
- 使用 Fragment 封装权限申请
- 使用 Fragment 优雅处理 onActivityResult
当然,这些封装,网上都有相应的开源库了, RxPermission, EasyPermision, RxActivityReslut 等,这里讲解如何封装,主要是让大家了解背后的原理,加深理解。想要成为一名优秀的工程师(程序猿),光停留在表面是远远不够的,我们要多读源码,理解背后的原理。哈哈,废话不多说,开始进入正文。
Fragment 封装权限申请
Android 6.0 动态权限机制,大家再熟悉不过了,如果我们没有对其进行封装,那我们每一次在申请权限的时候,大概需要以下几步:
这里我们已拨打电话为例子进行讲解
- 检查是否拥有电话权限,没有的话进行申请
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE},
10);
} else{
callPhone();
}
- 在 onRequestPermissionsResult 方法里面进行处理,然后进行相应的操作。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 10) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
callPhone();
} else {
// Permission Denied
Toast.makeText(TestResultActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
}
看到这样的代码你会不会很烦,每次涉及权限操作的时候,都要写这样一堆这样重复的代码,枯燥,且很多代码逻辑会耦合在 Activity 中,不方便维护。那有没有办法,将这些繁琐的步骤封装起来呢,答案是有的。
现在网上的做法一般有以下几种
- 使用透明的 Activity 进行申请
- 使用 Fragment 进行申请
- 反射
- AOSP
这里我们使用 Fragment 进行封装。
我们知道, Fragment 一般依赖于 Activity 存活,并且生命周期跟 Activity 差不多,因此,我们进行权限申请的时候,可以利用透明的 Fragment 进行申请,在里面处理完之后,再进行相应的回调。
- 当我们申请权限申请的时候,先查找我们当前 Activity 是否存在代理 fragment,不存在,进行添加,并使用代理 Fragment 进行申请权限
- 第二步:在代理 Fragment 的 onRequestPermissionsResult 方法进行相应的处理,判断是否授权成功
- 第三步:进行相应的回调
首先,我们先来看一下代理 Fragment EachPermissionFragment 是怎么封装的?
public class EachPermissionFragment extends Fragment {
private SparseArray<IPermissionListenerWrap.IPermissionListener> mCallbacks = new SparseArray<>();
private SparseArray<IPermissionListenerWrap.IEachPermissionListener> mEachCallbacks = new SparseArray<>();
private Random mCodeGenerator = new Random();
private FragmentActivity mActivity;
public EachPermission