都会需要有用到BaseActivity,从最开始的initData、initView,到后来需要承载监听推送、监听网络变化的广播、延迟锁定等等各种需求,BaseActivity的功能越来越杂,越来越密集。相对实际的页面上的功能需求,基类的封装经过这样长时间的无脑堆砌,到最后看起来会更匪夷所思。所以从一开始,Base的封装就要足够清晰、稳健、可扩展。
AndroidBase
我的思路是分层继承,每一层只做和这一层功能相关的事,变动修改单一功能都是清晰的,同时在最后的一层功能又是完整的。
AppCompatActivity
|
BaseViewActivity
|
BaseFunctionsActivity
|
BaseViewModelActivity
|
BaseMVPActivity
|
BaseToolbarActivity
1.BaseViewActivity(View层)
主要代码:
public abstract class BaseViewActivity extends AppCompatActivity
{
private View rootView;
protected VB vBinding;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRequestedOrientation(getScreenOrientation());//竖屏
vBinding = ViewBindingCreator.createViewBinding(getClass(), getLayoutInflater());
rootView = generateContentView(vBinding == null ? getContentView() : vBinding.getRoot());
setContentView(rootView);
}
protected View getContentView()
{
return null;
}
protected View generateContentView(View contentView)
{
return contentView;
}
protected int getScreenOrientation()
{
return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
public void showLoadingDialog()
{
}
public void hideLoadingDialog()
{
}
}
ViewBindingCreator主要代码:
@SuppressWarnings("unchecked")
public static VB createViewBinding(Class targetClass,
LayoutInflater layoutInflater)
{
Type type = targetClass.getGenericSuperclass();
if (type instanceof ParameterizedType)
{
try
{
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
for (Type type1 : types)
{
if (type1.getTypeName()
.endsWith("Binding"))
{
Method method = ((Class) type1).getMethod("inflate",
LayoutInflater.class);
return (VB) method.invoke(null, layoutInflater);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
} return null;
}
public abstract class BaseViewFragment extends Fragment
{
protected VB vBinding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState)
{
if (vBinding == null)
{
vBinding = ViewBindingCreator.createViewBinding(getClass(), inflater);
View rootView = generateContentView(
vBinding == null ? getContentView() : vBinding.getRoot());
rootView.setBackgroundColor(getResources().getColor(R.color.colorBackgroundTint));
onCreateView(rootView);
}
return vBinding.getRoot();
}
protected abstract void onCreateView(View rootView);
protected View getContentView()
{
return null;
}
protected View generateContentView(View contentView)
{
return contentView;
}
protected void setStatusBarTextDark(boolean isStatusBarTextDark)
{
Activity activity = getActivity();
if (activity instanceof BaseViewActivity)
{
((BaseViewActivity) activity).setStatusBarTextDark(isStatusBarTextDark);
}
}
protected void showLoadingDialog()
{
Activity activity = ge