啰嗦話不多說,先上代碼?。?!
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ù)自身的項目需求做進一步的擴展封裝。