Android Jetpack组件 —— lifecycle

Lifecycle生命周期感知组件

传统的MVP结构,P层需要在打开页面时进行一些网络或者其它操作,或者在页面销毁前释放资源,需要和activity/fragment进行生命周期绑定,可通过如下代码。

public class HomeActivity extends AppCompatActivity {

    private HomePresenter mPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        mPresenter = new HomePresenter();
        mPresenter.onCreate();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.onDestroy();
    }
}
public class HomePresenter {

    public HomePresenter() {
    }

    protected void onCreate() {
        //加载数据
    }

    protected void onDestroy() {
        //释放资源
    }
}

Google 在2018的IO大会上推出了Lifecycle生命周期感知组件。

  • 需要监听activity/fragment的观察者,实现LifecycleObserver接口
  • 被观察者activity/fragment,添加观察者对象,getLifecycle().addObserver(observer)
  • 监听的Event事件有:ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY,定义在Lifecycle.Event中,枚举类型

使用举例:

public class HomeActivity extends AppCompatActivity {

    private String TAG = "xzz HomeActivity";
    private HomePresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        mPresenter = new HomePresenter();
        getLifecycle().addObserver(mPresenter); //关键代码
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}
public class HomePresenter implements LifecycleObserver {
    private String TAG = "xzz HomePresenter";

    public HomePresenter() {
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void onCreate() {
        Log.w(TAG, "onCreate");
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void onDestroy() {
        Log.w(TAG, "onDestroy");
    }
}

源码分析:

Fragment

Fragment实现了LifecycleOwner接口,返回一个mLifecycleRegistry对象。

系统回调Fragment的各个方法,会回调mLifecycleRegistry的相关方法,和Fragment的生命周期方法。

public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
        ViewModelStoreOwner {
    LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
       	  return mLifecycleRegistry;
    }

   void performCreate(Bundle savedInstanceState) {
        mState = CREATED;
        onCreate(savedInstanceState); //回调Fragment的onCreate
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); //分发ON_CREATE事件
    }
    
    void performStart() {
        mState = STARTED;
        onStart();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }

    void performResume() {
        mState = RESUMED;
        onResume();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }

    void performPause() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
        mState = STARTED;
        onPause();
    }

    void performStop() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
        mState = STOPPED;
        onStop();
    }

    void performDestroy() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
        mState = INITIALIZING;
        onDestroy();
    }
 }

OnLifecycleEvent 是个运行时注解,作用于方法上。
在addObserver(lifecycleObserver)时,会通过反射获取lifecycleObserver的相应注解方法,保存在map中,分发事件时,再回调相应的监听事件。

 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
 
@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent { 
    Lifecycle.Event value(); //Lifecycle的这个六个Event,正是我们在presenter中监听的那些事件。
}

Activity的实现生命周期监听的原理:
在SupportActivity的onCreate()中,
Activity中getLifecycle(),回调到SupportActivity中。

public class SupportActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    @SuppressWarnings("RestrictedApi")
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReportFragment.injectIfNeededIn(this);
    }
    
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;  //返回一个LifecycleRegistry对象,LifecycleRegistry继承自Lifecycle
    }
}

ReportFragment#injectIfNeededIn(activity)
往activity中添加一个ReportFragment,所以监听activity的生命周期相当于监听fragment的生命周期。

public class ReportFragment extends Fragment {
    private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
            + ".LifecycleDispatcher.report_fragment_tag";

    public static void injectIfNeededIn(Activity activity) {
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // Hopefully, we are the first to make a transaction.
            manager.executePendingTransactions();
        }
    }

    static ReportFragment get(Activity activity) {
        return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
                REPORT_FRAGMENT_TAG);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值