Android 比較實用的BaseActivity、BaseFragment

啰嗦話不多說,先上代碼?。?!

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());

        // 創(chuàng)建presenter
        presenter = onCreatePresenter();

        // 添加類集合隊列
        AppManager.getAppManager().addContext(this);
        // 注冊ButterKnife
        ButterKnife.bind(this);
        // 注冊EventBus
        EventBus.getDefault().register(this);
        // 設(shè)置狀態(tài)欄
        setStatuBar();

        parseData();
        initView();
        initData();
        initListener();
        initReceiver();
    }

    /**
     * 廣播-監(jiān)聽網(wǎng)絡(luò)狀態(tài)
     */
    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"))){
                        // 登錄狀態(tài),而且網(wǎng)絡(luò)切換到有網(wǎng)狀態(tài),通知界面刷新
                        EventBus.getDefault().post(new ReLoadEvent());
                    }

                    switch (type) {
                        case ConnectivityManager.TYPE_MOBILE: // 移動網(wǎng)絡(luò)
                            NetChangeUtil.getInstance().setLastNetState("0");
                            break;
                        case ConnectivityManager.TYPE_WIFI: // wifi網(wǎng)絡(luò)
                            NetChangeUtil.getInstance().setLastNetState("1");
                            break;
                    }
                } else {
                    NetChangeUtil.getInstance().setLastNetState("-1");
                }
            }
        }
    };

    /**
     * 布局文件(必須重寫)
     */
    public abstract int getLayoutResId();

    /**
     * 創(chuàng)建presenter(需要的話重寫)
     */
    public P onCreatePresenter() {
        return null;
    }

    /**
     * 解析數(shù)據(jù)
     */
    public void parseData(){}

    /**
     * 初始化視圖
     */
    public void initView() {}

    /**
     * 初始化數(shù)據(jù)
     */
    public void initData() {}

    /**
     * 初始化請求
     */
    public void initRequest() {}

    /**
     * 初始化時間監(jiān)聽
     */
    public void initListener() {}

    /**
     * 注冊網(wǎng)絡(luò)監(jiān)聽的廣播
     */
    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);
    }

    /**
     * 設(shè)置狀態(tài)欄(普通、沉浸、全屏)
     * 根據(jù)需要重寫
     *
     * StatusBarUtil常用方法:
     *     1.設(shè)置狀態(tài)欄顏色        StatusBarUtil.setColor(Activity activity, int color)
     *     2.設(shè)置狀態(tài)欄半透明      StatusBarUtil.setTranslucent(Activity activity, int statusBarAlpha)
     *     3.設(shè)置狀態(tài)欄全透明      StatusBarUtil.setTransparent(Activity activity)
     *     4.ImageView頭部         StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView)
     *
     *
     * setSystemUiVisibility(int visibility)方法可傳入的實參為:
     *     1. View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態(tài)欄,Activity不全屏顯示(恢復(fù)到有狀態(tài)欄的正常情況)。
     *     2. View.INVISIBLE:隱藏狀態(tài)欄,同時Activity會伸展全屏顯示。
     *     3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態(tài)欄被隱藏覆蓋掉。
     *     4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示,但狀態(tài)欄不會被隱藏覆蓋,狀態(tài)欄依然可見,Activity頂端布局部分會被狀態(tài)遮住。
     *     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:狀態(tài)欄顯示處于低能顯示狀態(tài)(low profile模式),狀態(tài)欄上一些圖標顯示會被隱藏。
     */
    protected void setStatuBar(){
        StatusBarUtil.setLightMode(this);
        // 鑒于上面的setLightMode自帶全屏顯示效果,所以在這里默認隱藏掉全屏效果,如需使用,在指定界面重寫setStatuBar方法進行設(shè)置。
        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);
    }

   /**
     * 聯(lián)網(wǎng)恢復(fù)-重新請求最新數(shù)據(jù)
     *
     * @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:

/**
 * 網(wǎng)絡(luò)變化工具類
 *
 * Created by cxd on 2018/12/7
 */
public class NetChangeUtil {

    private static NetChangeUtil util;

    /**
     * -1  無網(wǎng)絡(luò)
     * 0  移動網(wǎng)
     * 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 {

    /**
     * 關(guān)閉輸入法
     */
    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);
    }

    /**
     * 獲取鍵盤狀態(tài)
     */
    public static boolean isActiveState(Context context) {
        InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        return manager.isActive();
    }
}

整體來說比較好理解:
1.onCreatePresenter方法根據(jù)界面需求看是否需要自定義添加。
2.parseData方法解析界面?zhèn)鬟f的數(shù)據(jù)。
3.initView方法初始化視圖
4.initData方法初始化數(shù)據(jù)加載
5.initRequest方法主要用于進入界面后的網(wǎng)絡(luò)請求刷新。
6.initListener方法監(jiān)聽相關(guān)事件
7.網(wǎng)絡(luò)狀態(tài)監(jiān)聽、狀態(tài)欄初始化

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);

        // 創(chuàng)建presenter
        presenter = onCreatePresenter();

        parseData();
        initView();
        initData();
        initRequest();
        initListener();
    }

    /**
     * 布局文件(必須重寫)
     */
    protected abstract int setLayoutResourceID();

    /**
     * 創(chuàng)建presenter(需要的話重寫)
     */
    public P onCreatePresenter() {
        return null;
    }

    /**
     * 解析數(shù)據(jù)(僅一次)
     */
    public void parseData(){}

    /**
     * 初始化視圖(可重復(fù))
     */
    public void initView() {}

    /**
     * 初始化數(shù)據(jù)(僅一次)
     */
    public void initData() {}

    /**
     * 初始化請求(可重復(fù))
     */
    public void initRequest() {}

    /**
     * 初始化時間監(jiān)聽(僅一次)
     */
    public void initListener() {}

    /**
     * 聯(lián)網(wǎng)恢復(fù)-重新請求最新數(shù)據(jù)
     *
     * @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();
    }
}

整體邏輯比較簡單,當然了,我們可以根據(jù)自身的項目需求做進一步的擴展封裝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容