Android 官方体系架构Lifecycle

前言

   Google I/O 2017提出的Android新体系架构Lifecycle其根本目的是实现Activity和Fragment的生命周期与逻辑的解耦,也可以在自定义View中实现监听Activity或者Fragment的生命周期(注意你获取的Lifecycle对象来自哪里就是监听的哪一个Activity或者Fragment).在MVP架构中我们就可以实现在Presenter中监听Activity和Fragment的生命周期,这样也就做到了解耦合.

Lifecycle观察的几种状态

  • ON_CREATE:关联onCreate事件
  • ON_START:关联onStart事件
  • ON_RESUME:关联onResume事件
  • ON_PAUSE:关联onPause事件
  • ON_STOP:关联onStop事件
  • ON_DESTROY:关联onDestroy事件
  • ON_ANY:关联所有的生命周期的事件,可用于检查状态改变

Lifecycle相关的类

  • Lifecycle 用于添加或移除观察对象,获取当前状态,且包含了观察状态的枚举类
  • LifecycleOwner 一个接口,只含有一个方法获取Lifecycle对象的方法
  • LifecycleObserver 一个接口,其本身不含有任何方法,只是用于标记这个类是一个生命周期的观察类
  • LifecycleRegistry 用于自定义一个生命周期的观察类

Lifecycle的使用

(1)创建一个接口实现LifecycleObserver

public interface IPresenter extends LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    default void OnCreate(@NonNull LifecycleOwner owner){}

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    default void OnDestroy(@NonNull LifecycleOwner owner){}

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    default void OnPause(@NonNull LifecycleOwner owner){}

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    default void OnResume(@NonNull LifecycleOwner owner){}

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    default void OnStart(@NonNull LifecycleOwner owner){}

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    default void OnStop(@NonNull LifecycleOwner owner){}

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    default void OnLifeCycleChanged(@NonNull LifecycleOwner owner){}
}

(2)创建一个IPresenter的实现类

public class PresenterImpl implements IPresenter {

    private String TAG = "Test";
    private String Name;

    public PresenterImpl(String name){
        this.Name = name;
    }

    @Override
    public void OnCreate(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnCreate");
    }

    @Override
    public void OnDestroy(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnDestroy");
    }

    @Override
    public void OnPause(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnPause");
    }

    @Override
    public void OnResume(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnResume");
    }

    @Override
    public void OnStart(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnStart");
    }

    @Override
    public void OnStop(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnStop");
    }

    @Override
    public void OnLifeCycleChanged(@NonNull LifecycleOwner owner) {
        Log.d(TAG,Name+":OnLifeCycleChanged");
    }
}

(3)在Presenter中监听Activity的生命周期

public class MainActivity extends AppCompatActivity {

    private IPresenter mPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPresenter = new PresenterImpl("MainActivity");
        getLifecycle().addObserver(mPresenter);

    }
}

(4)在Presenter中监听Fragment的生命周期

public class MFragment extends Fragment {
    private IPresenter mPresenter;
    private View mRootView;
    private MTextView mTextView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if(mRootView==null){
            mRootView = inflater.inflate(R.layout.fragment_test,container,false);
            mPresenter = new PresenterImpl("MFragment");
            getLifecycle().addObserver(mPresenter);
            mTextView = mRootView.findViewById(R.id.textView);
            mTextView.setLifecycle(getLifecycle());
        }
        return mRootView;
    }
}

(5)在自定义View中监听Activity或者Fragment的生命周期
这里我们通过setLifecycle方法为View设置监听(这里的lifecycle如果是来自Activity的则监听的是该Activity的生命周期,如果来自Fragment则是监听该Fragment的生命周期)

public class MTextView extends AppCompatTextView implements IPresenter {
    
    private String TAG = "Test";

    public MTextView(Context context) {
        this(context,null);
    }

    public MTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    public void setLifecycle(Lifecycle lifecycle){
        lifecycle.addObserver(this);
    }

    @Override
    public void OnCreate(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnCreate");
    }

    @Override
    public void OnDestroy(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnDestroy");
    }

    @Override
    public void OnPause(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnPause");
    }

    @Override
    public void OnResume(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnResume");
    }

    @Override
    public void OnStart(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnStart");
    }

    @Override
    public void OnStop(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnStop");
    }

    @Override
    public void OnLifeCycleChanged(@NonNull LifecycleOwner owner) {
        Log.d(TAG,"OnLifeCycleChanged");
    }
}

源码地址

LifecycleDemo源码地址
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值