咳咳,前段时间受伤了,本来打算好好写博客的心思也就顺势断了一段时间,伤好了又犯懒了一段时间,今天决定不能颓废了,虽然没人看,但就当是自己记录东西了,今天写点贼基础的,BaseActivity,练练手先。下面直奔主题,show my code, 哈哈。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(getLayout());
translucentStatusBarConfig();
mUnBinder = ButterKnife.bind(this);
mContext = this;
mReceiver = new NetworkReceiver(this);
mDialogFactory = new DialogFactory(getSupportFragmentManager());
initData(savedInstanceState);
}
onCreate方法如上,很常规,其中translucentStatusBarConfig()是用来做沉浸式状态栏的,代码和原理很简单,不赘述,直接看
protected void translucentStatusBarConfig(){
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(getResources().getColor(R.color.transparent));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 设置状态栏透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);
ViewGroup rootView= (ViewGroup) contentView.getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
int statusId = getResources().getIdentifier("status_bar_height", "dimen", "android");
int height = 50;
if (statusId > 0) {
height = getResources().getDimensionPixelSize(statusId);
}
View statusBarView = new View(this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
height);
statusBarView.setBackgroundColor(getResources().getColor(R.color.transparent));
contentView.addView(statusBarView, lp);
}
}
ButterKnife不多说,NetworkReceiver是一个网络变化的广播监听,代码如下
public static class NetworkReceiver extends BroadcastReceiver {
private WeakReference<BaseActivity> weak;
public NetworkReceiver(BaseActivity weak) {
this.weak = new WeakReference<>(weak);
}
public void onReceive(final Context context, Intent intent) {
weak.get().dismissErrorDialog();
if (!NetWorkUtil.isConnected()) {
weak.get().showErrorDialog(null, null, true, false);
}
}
}
注册解注册如下,工具类就是注册广播的,不赘述,Flag是保持屏幕常亮的,按需决定是否添加
@Override
protected void onResume() {
super.onResume();
NetworkUtils.NetworkReceiverUtil.registerNetworkReceive(this, mReceiver);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
protected void onPause() {
super.onPause();
NetworkUtils.NetworkReceiverUtil.unregisterNetworkReceive(this, mReceiver);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
其中showErrorDialog(null, null, true, false)方法以及下面的showLoading()是我封装的DialoagFragment,具体代码以后博客更新,先贴BaseActivity里的方法,如下
/**
* 显示正在加载
*/
public void showLoadingDialog() {
showLoadingDialog(null, true);
}
public void showLoadingDialog(String msg, boolean cancelable) {
mDialogFactory.showLoadingDialog(msg, cancelable);
}
/**
* 隐藏正在加载
*/
public void dismissLoadingDialog() {
mDialogFactory.dismissLoadingDialog();
}
/**
* 显示错误对话框
*/
public void showErrorDialog() {
showErrorDialog(null, null,true, true);
}
public void showErrorDialog(String title, String subtitle, boolean cancelable, boolean isConnected) {
mDialogFactory.showErrorDialog(title, subtitle, cancelable, isConnected);
}
/**
* 隐藏错误对话框
*/
public void dismissErrorDialog() {
mDialogFactory.dismissErrorDialog();
}
initData(savedInstanceState)是个空方法,供子类做初始化操作,可以不重写,但提倡在initData里进行初始化,代码比较统一,最后,现在的代码基本都遵循MVP的设计架构,我也不例外,所以会有如下俩个属性
private CompositeDisposable mCompositeDisposable;
private List<Observer> observerList;
常用RxJava的同学应该知道,现在subscribe()方法你如果传入的是Observer对象的话,返回值是void的,所以我自己维护了一个Observer的集合,自己进行资源释放,Flowable同理,当然,RxJava也提供了简易的Consumer供我们使用,如果传入的是Consumer对象,subscribe()返回值和以前一样,是Disposable对象,我们就可以继续用CompositeDisposable来进行资源释放,添加及onDestroy()代码如下
public void addDisposable(Disposable disposable) {
if (mCompositeDisposable == null) mCompositeDisposable = new CompositeDisposable();
mCompositeDisposable.add(disposable);
}
public void addObserver(Observer observer) {
if (observerList == null) observerList = new ArrayList<>();
observerList.add(observer);
}
@Override
protected void onDestroy() {
if (mUnBinder != null) mUnBinder.unbind();
super.onDestroy();
if (mCompositeDisposable != null) mCompositeDisposable.clear();
if(observerList != null) {
for (Observer s : observerList) s.onComplete();
observerList.clear();
}
}
以上,我的BaseActivity就完成了,其中,还涉及到FragmentDialog,BaseObserver,BaseConsumer,包括BaseMVPActivity等等,我打算做成一个系列,既是自己的一个记录,也希望能侥幸帮到其他人,共同进步,下篇博客见。