Android Fragment 的妙用 - 优雅地申请权限和处理 onActivityResult

前言

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值