有关Fragment的妙用
Fragment 是Google于Android3.0推出的, 是用于解决Android设备碎片化的方案, 说起Fragment, 大部分人第一时间想到的应该是和UI相关, 但今天我要说的, 是Fragment除去绘制界面之外的用途。
Fragment的用途:
- 绘制界面
- 检测Activity生命周期
- 存储变量(相当于Activity的扩展变量)
上面我给出了三个用途, 绘制界面就不谈了, 我们做Android开发的天天都会用到, 今天主要谈谈其他两个。
检测Activity生命周期
最简单的一个例子,就是我们所熟知Glide,其源码中就用到了Fragment来检测Activity的声明周期, 如下是关键代码:
那么这么做有什么好处呢?
- 可以达到监听Activity生命周期的目的
- 无需重写Activity生命周期方法
- 在任意地方都可以使用, 只需要一个 Activity 对象
- 请求权限时无需重写
onRequestPermissionsResult()
方法 startActivityForResult()
时无需在Activity中重写onActivityResult()
方法
那么如何利用Fragment做到上述5点呢? 不要着急, 且听我徐徐道来
1. 监听Activity生命周期(实现1 2 3三点)
准确来讲, 是监听Activity除onCreate()之外的其他常用生命周期。我们知道, 当我们创建一个Fragment, 有时会重写下面几个方法:
onActivityCreated(Bundle savedInstanceState)
onResume()
onPause()
onStart()
onStop()
onDestroy()
onSaveInstanceState(Bundle outState)
我们首先要明确一点, 这些方法并非是Fragment的声明周期方法, 而是Activity的声明周期方法, 大家可以自行写Demo测试或者查看源码。今天所说的Fragment的用途全部都是建立在此基础之上的。
回到正题,要想利用Fragment检测Activity声明周期, 其实只需要创建一个Fragment添加至Activity中, 就可以监听Activity的声明周期。至此我们已经达到目的了。
public DemoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Activity activity = ActivityHelper.getActivity(getContext());
activity.getFragmentManager().beginTransaction().add(new Fragment(){
@Override
public void onDestroy() {
super.onDestroy();
}
}, "TEST").commitAllowingStateLoss();
}
那么每次需要监听Activity声明周期都要创建一个Fragment吗?显然是否定的, 我们只需要创建一个特殊的Fragment, 在其中定义一个集合供外加添加或移除监听, 仅需要一个Fragment就可以达到目的。
public class ActivityLifecycleFragment extends android.support.v4.app.Fragment{
private static final int CAPACITY = 5;
private List<ActivityLifecycle> mCallbacks = new ArrayList<>(CAPACITY);
public ActivityLifecycleFragment addCallback(ActivityLifecycle callbacks) {
mCallbacks.add(callbacks);
return this;
}
public ActivityLifecycleFragment removeCallback(ActivityLifecycle callbacks){
mCallbacks.remove(callbacks);
return this;
}
//...然后在 onResume() onPause() 等方法中调用 mCallbacks 一一触发监听
@Override
public void