BaseActivity封装

作者: kinglong1984 | 来源:发表于2019-01-29 17:59 被阅读339次

    1 封装点

    1.封装抽象方法

    初始化参数 initParams

    获取布局资源Id getLayoutResID

    初始化视图 initContentView

    加载数据 loadData

    监听返回事件 onGoBack

    监听网络变化 onNetWorkChanged

    2.封装通用方法

    初始化状态栏颜色(兼容不同sdk版本) initMaterialStatusBar

    重写setSupportActionBar(处理默认情况) setSupportActionBar

    启动活动的方法 startActivity

    弹出Toast提示的方法 showToast

    弹出和隐藏加载中提示框的方法 showLoadDialog hideLoadDialog

    获取主题色的方法 getColorPrimary和getDarkColorPrimary

    3.BaseActivity 处理通用逻辑

    onCreate中调用抽象方法、通用方法等处理初始化参数、加载布局、初始化视图、初始化状态栏为主题色、加载数据、注册广播监听(处理应用注销)等逻辑。

    onResume和onPause中添加和移除对网络监听事件。

    onOptionsItemSelected和onKeydown中处理返回事件(包括ActionBar、Toolbar的导航返回菜单项、手机返回键的事件)

    onDestroy中注销广播监听。

    2 BaseActivity代码清单

    /**
    
    * Created on 2018/8/17.
    
    * @author lujinlong
    
    */
    
    public abstract class BaseActivity extends AppCompatActivityimplements NetBroadcastReceiver.NetworkListener  {
    
    /**
    
    * 初始化参数
    
    * 考虑系统恢复Activity调用onCreate时从savedInstanceState中恢复参数的情况
    
    * @param savedInstanceState
    
    */
    
    protected abstract void initParams(Bundle savedInstanceState);
    
    // 由子类设置资源ID
    
    protected abstract int getLayoutResID();
    
    // 初始化视图
    
    protected abstract void initContentView();
    
    // 加载数据
    
    protected abstract void loadData();
    
    // 处理返回事件
    
    // 子类返回false 则表示交给父类处理
    
    protected abstract boolean onGoBack();
    
    // 监听网络状态变化
    
    // @param status 网络状态 -1 网络断开,0 手机网络,1 Wifi网络
    
    @Override
    
    public void onNetWorkChanged(int status) {// 子类需监听网络变化的,可重写该方法}
    
    // 加载提示框
    
    private LoadingProgressDialogloadDialog =null;
    
    private BroadcastReceiverlogoutReceiver;
    
    public static NetBroadcastReceiver.NetworkListenerNETWORK_LISTENER;
    
    @Override
    
    protected void onCreate(Bundle savedInstanceState) {
    
           super.onCreate(savedInstanceState);
    
           initParams(savedInstanceState);
    
           setContentView(getLayoutResID());
    
           initMaterialStatusBar(getColorPrimary());
    
            loadDialog =new LoadingProgressDialog(this, R.style.progress_dialog_loading,"加载中...");
    
            initContentView();
    
            loadData();
    
            IntentFilter filter =new IntentFilter("action_logout");
    
            logoutReceiver =new BroadcastReceiver() {
    
           @Override
    
           public void onReceive(Context context, Intent intent) {
    
                finish();
    
           }
    
    };
    
    registerReceiver(logoutReceiver, filter);
    
    }
    
    @Override
    
    protected void onResume() {
    
            super.onResume();
    
            // 让当前活动的Activity监听网络变化
    
            NETWORK_LISTENER =this;
    
    }
    
    @Override
    
    protected void onPause() {
    
        super.onPause();
    
        NETWORK_LISTENER =null;
    
    }
    
    @Override
    
    protected void onDestroy() {
    
         super.onDestroy();
    
         if (logoutReceiver !=null) unregisterReceiver(logoutReceiver);
    
        }
    
    // 状态栏样式处理
    
    protected void initMaterialStatusBar(@ColorInt int statusBarColor) {
    
        if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.KITKAT
    
           &&Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP) {   getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    
    }
    
    StatusBarCompat.setStatusBarColor(this, statusBarColor);
    
    }
    
    // 覆盖setSupportActionBar的默认实现
    
    protected void setSupportActionBar(@IdRes int toolbarId) {
    
           Toolbar toolbar = findViewById(toolbarId);
    
           setSupportActionBar(toolbar);
    
     }
    
    // 覆盖setSupportActionBar的默认实现
    
    @Override
    
    public void setSupportActionBar(@Nullable Toolbar toolbar) {
    
         super.setSupportActionBar(toolbar);
    
         ActionBar actionBar = getSupportActionBar();
    
         if (actionBar !=null) {// 显示返回键
    
              actionBar.setDisplayHomeAsUpEnabled(true);
    
              actionBar.setDisplayShowTitleEnabled(false);
    
              actionBar.setElevation(0);
    
        }
    
    }
    
    // 处理toolbar上的返回键
    
    @Override
    
    public boolean onOptionsItemSelected(MenuItem item) {
    
        if (item.getItemId() == android.R.id.home) {
    
             if (!onGoBack()) supportFinishAfterTransition();
    
             return true;
    
        }
    
        return super.onOptionsItemSelected(item);
    
    }
    
    /**
    
    * 处理返回键
    
    * 三星,OPPO等机型手机上有不执行onBackPressed()的情况,因此统一在onKeyDown中处理
    
    */
    
    @Override
    
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() ==0) {
    
            if (!onGoBack()) { supportFinishAfterTransition();}
    
            return true;
    
        } 
    
        return super.onKeyDown(keyCode, event);
    
    }
    
    //==========================Helper============================//
    
    // 启动活动 
    
    protected void startActivity(Class clazz, Bundle bundle) {//省略}
    
    // 启动活动 需要处理返回结果
    
    protected void startActivityForResult(Class clazz,int requestCode, Bundle bundle) {//省略}
    
    // 弹出Toast消息
    
    protected void showToast(@StringRes int resId) {//省略}
    
    // 弹出Toast消息
    
    protected void showToast(String msg) {//省略}
    
    // 显示加载提示框
    
    protected void showLoadDialog() { if (loadDialog !=null) loadDialog.show();  }
    
    // 隐藏加载提示框
    
    protected void hideLoadDialog() {loadDialog.dismiss(); }
    
    // 获取主题颜色
    
    protected int getColorPrimary() {//省略}
    
    // 获取深色的主题颜色
    
    protected int getDarkColorPrimary() {//省略}
    
    }
    
    // 注:省略了部分方法的实现,完整代码地址如下:https://github.com/kinglong198404/android-architecture/blob/master/Framework/baseui/src/main/java/com/klfront/baseui/activity/BaseActivity.java
    
    3 BaseSimpleActivity代码清单
    如果一些Activity不想实现initParams和loadData,嫌繁琐,可以再封装一个基类BaseSimpleActivity,对上述两个方法空实现。
    
    这样继承BaseSimpleActivity的Activity就不必实现initParams和loadData两个抽象方法。
    
    public abstract class BaseSimpleActivity extends BaseActivity {
    
        @Override
    
        protected void initParams(Bundle savedInstanceState) { // 空实现 }
    
        @Override
    
        protected void loadData() { // 空实现 }
    
    }
    
    

    相关文章

      网友评论

        本文标题:BaseActivity封装

        本文链接:https://www.haomeiwen.com/subject/iuaxsqtx.html