美文网首页Android
Android 比较实用的BaseActivity、BaseFr

Android 比较实用的BaseActivity、BaseFr

作者: 节庆007 | 来源:发表于2019-03-01 14:12 被阅读0次

    啰嗦话不多说,先上代码!!!

    BaseActivity:

    /**
     * 基类
     *
     * Created by cxd on 2018/10/23
     */
    public abstract class BaseActivity<P> extends AppCompatActivity {
    
        /**
         * presenter
         */
        public P presenter;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getLayoutResId());
    
            // 创建presenter
            presenter = onCreatePresenter();
    
            // 添加类集合队列
            AppManager.getAppManager().addContext(this);
            // 注册ButterKnife
            ButterKnife.bind(this);
            // 注册EventBus
            EventBus.getDefault().register(this);
            // 设置状态栏
            setStatuBar();
    
            parseData();
            initView();
            initData();
            initListener();
            initReceiver();
        }
    
        /**
         * 广播-监听网络状态
         */
        BroadcastReceiver netReceiver =new BroadcastReceiver(){
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    
                    if (null != networkInfo && networkInfo.isAvailable()) {
                        int type = networkInfo.getType();
                        String lastNetState = NetChangeUtil.getInstance().getLastNetState();
    
                        if(!TextUtils.isEmpty(lastNetState)
                                && !TextUtils.equals(lastNetState, String.valueOf(type))
                                && (TextUtils.equals(String.valueOf(type), "0") || TextUtils.equals(String.valueOf(type), "1"))){
                            // 登录状态,而且网络切换到有网状态,通知界面刷新
                            EventBus.getDefault().post(new ReLoadEvent());
                        }
    
                        switch (type) {
                            case ConnectivityManager.TYPE_MOBILE: // 移动网络
                                NetChangeUtil.getInstance().setLastNetState("0");
                                break;
                            case ConnectivityManager.TYPE_WIFI: // wifi网络
                                NetChangeUtil.getInstance().setLastNetState("1");
                                break;
                        }
                    } else {
                        NetChangeUtil.getInstance().setLastNetState("-1");
                    }
                }
            }
        };
    
        /**
         * 布局文件(必须重写)
         */
        public abstract int getLayoutResId();
    
        /**
         * 创建presenter(需要的话重写)
         */
        public P onCreatePresenter() {
            return null;
        }
    
        /**
         * 解析数据
         */
        public void parseData(){}
    
        /**
         * 初始化视图
         */
        public void initView() {}
    
        /**
         * 初始化数据
         */
        public void initData() {}
    
        /**
         * 初始化请求
         */
        public void initRequest() {}
    
        /**
         * 初始化时间监听
         */
        public void initListener() {}
    
        /**
         * 注册网络监听的广播
         */
        private void initReceiver() {
            IntentFilter timeFilter = new IntentFilter();
            timeFilter.addAction("android.net.ethernet.ETHERNET_STATE_CHANGED");
            timeFilter.addAction("android.net.ethernet.STATE_CHANGE");
            timeFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            timeFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
            timeFilter.addAction("android.net.wifi.STATE_CHANGE");
            timeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
            registerReceiver(netReceiver, timeFilter);
        }
    
        /**
         * 设置状态栏(普通、沉浸、全屏)
         * 根据需要重写
         *
         * StatusBarUtil常用方法:
         *     1.设置状态栏颜色        StatusBarUtil.setColor(Activity activity, int color)
         *     2.设置状态栏半透明      StatusBarUtil.setTranslucent(Activity activity, int statusBarAlpha)
         *     3.设置状态栏全透明      StatusBarUtil.setTransparent(Activity activity)
         *     4.ImageView头部         StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView)
         *
         *
         * setSystemUiVisibility(int visibility)方法可传入的实参为:
         *     1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态栏的正常情况)。
         *     2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
         *     3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
         *     4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
         *     5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
         *     6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
         *     7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
         *     8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
         */
        protected void setStatuBar(){
            StatusBarUtil.setLightMode(this);
            // 鉴于上面的setLightMode自带全屏显示效果,所以在这里默认隐藏掉全屏效果,如需使用,在指定界面重写setStatuBar方法进行设置。
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }
    
            StatusBarUtil.setColor(this, getResources().getColor(R.color.white), 0);
        }
    
       /**
         * 联网恢复-重新请求最新数据
         *
         * @param event
         */
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void reLoad(ReLoadEvent event){
            initRequest();
        }
    
        public void startActivityWithAnim(@NonNull Intent intent) {
            super.startActivity(intent);
            overridePendingTransition(R.anim.right_to_hold, R.anim.hold_on_left);
        }
    
        public void finishWithAnim() {
            super.finish();
            overridePendingTransition(R.anim.left_on_hold, R.anim.hold_to_right);
        }
    
        @Override
        public void onBackPressed() {
            IMEUtil.closeIME(this);
            finishWithAnim();
        }
    
        @Override
        protected void onResume() {
            JiBuUtil.checkBuShuUpLoad();
            super.onResume();
        }
    
        @Override
        protected void onStop() {
            IMEUtil.closeIME(this);
            super.onStop();
        }
    
        @Override protected void onDestroy() {
            EventBus.getDefault().unregister(this);
            AppManager.getAppManager().removeContext(this);
            if (null != netReceiver) {
                unregisterReceiver(netReceiver);
                netReceiver = null;
            }
            super.onDestroy();
        }
    }
    

    NetChangeUtil:

    /**
     * 网络变化工具类
     *
     * Created by cxd on 2018/12/7
     */
    public class NetChangeUtil {
    
        private static NetChangeUtil util;
    
        /**
         * -1  无网络
         * 0  移动网
         * 1  wifi
         */
        String lastNetState;
    
        public static NetChangeUtil getInstance(){
            if(null == util){
                synchronized (NetChangeUtil.class){
                    if(null == util){
                        util = new NetChangeUtil();
                    }
                }
            }
            return util;
        }
    
        public String getLastNetState() {
            return lastNetState;
        }
    
        public NetChangeUtil setLastNetState(String lastNetState) {
            this.lastNetState = lastNetState;
            return this;
        }
    }
    

    IMEUtil:

    /**
     * 输入法控制
     *
     * Created by cxd on 2018/11/29
     */
    public class IMEUtil {
    
        /**
         * 关闭输入法
         */
        public static void closeIME(Context context) {
            InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    
            try {
                View focusView = ((Activity) context).getCurrentFocus();
                if (manager != null && manager.isActive() && null != focusView) {
                    manager.hideSoftInputFromWindow(focusView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 显示输入法
         */
        public static void showIME(Context context) {
            InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            manager.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.RESULT_UNCHANGED_SHOWN);
        }
    
        /**
         * 隐藏软键盘
         */
        public static void hideSoftKeyboard(View view) {
            ((InputMethodManager) view.getContext().getSystemService(
                    Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(
                    view.getWindowToken(), 0);
        }
    
        /**
         * 显示软键盘
         */
        public static void showSoftKeyboard(View view) {
            ((InputMethodManager) view.getContext().getSystemService(
                    Context.INPUT_METHOD_SERVICE)).showSoftInput(
                    view, InputMethodManager.SHOW_FORCED);
        }
    
        /**
         * 获取键盘状态
         */
        public static boolean isActiveState(Context context) {
            InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            return manager.isActive();
        }
    }
    

    整体来说比较好理解:
    1.onCreatePresenter方法根据界面需求看是否需要自定义添加。
    2.parseData方法解析界面传递的数据。
    3.initView方法初始化视图
    4.initData方法初始化数据加载
    5.initRequest方法主要用于进入界面后的网络请求刷新。
    6.initListener方法监听相关事件
    7.网络状态监听、状态栏初始化

    BaseFragment:

    /**
     * 基类
     *
     * Created by cxd on 2018/11/15
     */
    public abstract class BaseFragment<P> extends Fragment {
    
        public P presenter;
    
        public Activity mActivity;
        public View mContentView;
    
        private Unbinder unbinder;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EventBus.getDefault().register(this);
            mActivity = getActivity();
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            if(null == mContentView) {
                mContentView = inflater.inflate(setLayoutResourceID(), container, false);
            }
            unbinder = ButterKnife.bind(this, mContentView);
            return mContentView;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
    
            // 创建presenter
            presenter = onCreatePresenter();
    
            parseData();
            initView();
            initData();
            initRequest();
            initListener();
        }
    
        /**
         * 布局文件(必须重写)
         */
        protected abstract int setLayoutResourceID();
    
        /**
         * 创建presenter(需要的话重写)
         */
        public P onCreatePresenter() {
            return null;
        }
    
        /**
         * 解析数据(仅一次)
         */
        public void parseData(){}
    
        /**
         * 初始化视图(可重复)
         */
        public void initView() {}
    
        /**
         * 初始化数据(仅一次)
         */
        public void initData() {}
    
        /**
         * 初始化请求(可重复)
         */
        public void initRequest() {}
    
        /**
         * 初始化时间监听(仅一次)
         */
        public void initListener() {}
    
        /**
         * 联网恢复-重新请求最新数据
         *
         * @param event
         */
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void reLoad(ReLoadEvent event){
            initRequest();
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            EventBus.getDefault().unregister(this);
        }
    
        @Override
        public void onDestroyView() {
            super.onDestroyView();
            unbinder.unbind();
        }
    }
    

    整体逻辑比较简单,当然了,我们可以根据自身的项目需求做进一步的扩展封装。

    相关文章

      网友评论

        本文标题:Android 比较实用的BaseActivity、BaseFr

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