package com.android.app_base.base.view; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.databinding.DataBindingUtil; import androidx.databinding.ViewDataBinding; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelStoreOwner; import com.android.app_base.base.viewmodel.BaseViewModel; import com.android.app_base.base.StateViewEnum; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * Activity基类,所有的 Activity 都要继承此类 */ public abstract class BaseActivity extends AppCompatActivity { protected V binding; protected VM viewModel; private int viewModelId; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //绑定 ViewDataBinding 和 ViewModel initViewDataBindingAndViewModel(); //初始化状态视图 initStateView(); //页面参数初始化方法 initParam(); //页面view初始化方法 initView(); //页面数据初始化方法 initData(); //页面事件监听的方法,用于ViewModel层转到View层的事件注册 initLiveDataObserve(); } @Override protected void onDestroy() { super.onDestroy(); //解除Messenger注册 // Messenger.getDefault().unregister(viewModel); if(binding != null){ binding.unbind(); } } /** * ViewDataBinding和 ViewModel的获取及相关绑定 */ private void initViewDataBindingAndViewModel() { binding = DataBindingUtil.setContentView(this, getLayoutId()); viewModelId = getVariableId(); viewModel = initViewModel(); //关联ViewModel binding.setVariable(viewModelId, viewModel); //支持LiveData绑定xml,数据改变,UI自动会更新 binding.setLifecycleOwner(this); //让ViewModel拥有View的生命周期感应 getLifecycle().addObserver(viewModel); } /** * 初始化ViewModel * @return 返回一个ViewModel */ private VM initViewModel() { Class vmClass; Type type = getClass().getGenericSuperclass(); if (type instanceof ParameterizedType){ vmClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[1]; } else { //如果没有指定泛型参数,则默认使用BaseViewModel vmClass = (Class) BaseViewModel.class; } return new ViewModelProvider(this, (ViewModelProvider.Factory) ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(vmClass); } /** * 对状态视图liveData进行观察监听 */ private void initStateView() { viewModel.getStateViewLiveData().observe(this, new Observer() { @Override public void onChanged(StateViewEnum stateViewEnum) { switch (stateViewEnum) { case DIALOG_LOADING: dialogLoading(); break; case DIALOG_DISMISS: dialogDismiss(); break; case DATA_LOADING: dataLoading(); break; case DATA_ERROR: dataError(); break; case DATA_NULL: dataNull(); break; case NET_ERROR: netError(); break; case HIDE: hide(); break; default: break; } } }); } /** * 缺省页等状态视图的更新 * 有需求的,在子类选择重写 */ protected void dialogLoading() { } protected void dialogDismiss() { } protected void dataLoading() { } protected void dataError() { } protected void dataNull() { } protected void netError() { } protected void hide() { } /** * 获取根布局的id,由子类实现返回 * @return layout的id */ public abstract int getLayoutId(); /** * 获取ViewModel的id,由子类实现返回 * @return BR中viewModel的id */ public abstract int getVariableId(); /** * 初始化页面参数,例如从上一个activity传递过来的参数 */ public abstract void initParam(); /** * 初始化页面view,例如一些view的隐藏或显示,以及点击逻辑等用户交互 */ public abstract void initView(); /** * 初始化页面数据 */ public abstract void initData(); /** * 初始化LiveData的监听 * 简单的数据展示可通过DataBinding直接双向绑定到xml中 */ public abstract void initLiveDataObserve(); }