(Base系列一)BaseActivity封装

咳咳,前段时间受伤了,本来打算好好写博客的心思也就顺势断了一段时间,伤好了又犯懒了一段时间,今天决定不能颓废了,虽然没人看,但就当是自己记录东西了,今天写点贼基础的,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等等,我打算做成一个系列,既是自己的一个记录,也希望能侥幸帮到其他人,共同进步,下篇博客见。

猜你喜欢

转载自blog.csdn.net/dujianbo369/article/details/80667490