日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Android封裝一個全局的BaseActivity

瀏覽:83日期:2022-09-19 16:53:28
1.前言 對于一個Android開發(fā)者來說,每一個頁面都繼承一個單獨的系統(tǒng)Activity,有時候會帶來很多不必要的困擾。比如:每一個頁面會有重復的代碼,閱讀起來麻煩;每一次寫新的頁面功能總要打開原來的頁面代碼拷貝一部分過來;有時候代碼調試排查問題也不方便等等。 如果你的項目里面沒有將Activity都繼承自一個自己封裝的BaseActivity、或者針對自己封裝的BaseActivity覺得還不夠完善的,這篇博客可能會對你有幫助!2.特點 封裝:將所有Activity都用到的一部分代碼封裝到一個統(tǒng)一管理的Activity類(后面全部起名叫BaseActivity),然后由這個BaseActivity繼承自Android系統(tǒng)的AppCompatActivity(一般是這個)。 繼承:頁面上用到的Activity都繼承自我們的自己BaseActivity,BaseActivity封裝的方法在Activity內(nèi)直接調用。 3.代碼及說明 3.1.優(yōu)缺點 優(yōu)點:減少了代碼的重復,提高了寫代碼的效率、以及提高了代碼的維護性 缺點:不要任何代碼都放在BaseActivity,那樣可能會導致BaseActivity過于臃腫,不利于代碼的閱讀和維護,甚至出現(xiàn)App奔潰

下面會討論哪些代碼應該放在BaseActivity里面,哪些需要謹慎

3.2.代碼

下面我貼一份我自己封裝的BaseActivity,在代碼中和代碼下面做了解釋:

public abstract class BaseActivity extends AppCompatActivity { public Activity mActivity; private Unbinder mUnbinder; private static float sNoncompatDensity; private static float sNoncompatScaledDensity; private MaterialDialog mDialog; @Override protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);onAdjustLayout();setContentView(setContentLayout());//這里的是初始化綁定ButterKnife,在onDestory做了銷毀mUnbinder = ButterKnife.bind(this);this.mActivity = this;//統(tǒng)一將一個activity添加到一個集合里面AppManager.getInstance().addActivity(mActivity);initToolBar();initPresenter();initData(savedInstanceState);Log.e('app', this.getClass().getSimpleName() + '------onCreate'); } @Override protected void onStart() {super.onStart();Log.e('app', this.getClass().getSimpleName() + '------onStart'); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);Log.e('app', this.getClass().getSimpleName() + '------onRestoreInstanceState'); } @Override protected void onRestart() {super.onRestart();Log.e('app', this.getClass().getSimpleName() + '------onRestart'); } @Override protected void onResume() {super.onResume();Log.e('app', this.getClass().getSimpleName() + '------onResume'); } @Override protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);Log.e('app', this.getClass().getSimpleName() + '------onSaveInstanceState'); } @Override protected void onPause() {super.onPause();Log.e('app', this.getClass().getSimpleName() + '------onPause'); } @Override protected void onStop() {super.onStop();Log.e('app', this.getClass().getSimpleName() + '------onStop'); } @Override protected void onDestroy() {super.onDestroy();onDestroyActivity();mUnbinder.unbind();Log.e('app', this.getClass().getSimpleName() + '------onDestroy'); } /** * 顯示一個Fragment */ public void showFragment(Fragment fragment) {if (fragment != null && fragment.isHidden()) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.show(fragment); fragmentTransaction.commit();} } /** * 隱藏一個Fragment */ public void hideFragment(Fragment fragment) {if (fragment != null && !fragment.isHidden()) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.hide(fragment); fragmentTransaction.commit();} }//這是一個設置toolbar標題欄的方法,ToolBarOptions類主要是持有一些id public void setToolBar(int toolBarId, ToolBarOptions options) {Toolbar toolbar = findViewById(toolBarId);if (options.titleId != 0) { toolbar.setTitle(options.titleId);} else { toolbar.setTitle('');}if (!TextUtils.isEmpty(options.titleString)) { toolbar.setTitle(options.titleString);}if (options.backgroundColor != 0) { toolbar.setBackgroundResource(options.backgroundColor);}if (options.logoId != 0) { toolbar.setLogo(options.logoId);}setSupportActionBar(toolbar);if (options.isNeedNavigate) { toolbar.setNavigationIcon(options.navigateId); toolbar.setContentInsetStartWithNavigation(0); toolbar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { if (!AppUtils.isNotFastClick()) {return; } onNavigateUpClicked();} });} }//子類直接調用展示toast public void showToast(String s) {ToastUtil.showToast(this, s); }//給子類提供一個獲取activity對象的方式 public Activity getActivity() {return this; }//一個彈窗l(fā)oading庫 github地址: //implementation ’com.afollestad.material-dialogs:core:0.9.6.0’ public void showLoading(String loadDesc) {mDialog = new MaterialDialog.Builder(this).progress(true, -1).content(loadDesc).canceledOnTouchOutside(false).cancelable(false).show(); } public void showLoading(int resId) {mDialog = new MaterialDialog.Builder(this).progress(true, -1).content(getString(resId)).canceledOnTouchOutside(false).cancelable(false).show(); } public void showLoading() {mDialog = new MaterialDialog.Builder(this).progress(true, -1).content('加載中...').canceledOnTouchOutside(false).cancelable(false).show(); } public void hideLoading() {if (mDialog != null) { mDialog.dismiss();} }//這里是退出app相關的邏輯,可以根據(jù)自己的退出做具體的處理 public void exitLogin() {SharedPreferenceUtils.getInstance(mActivity).put(Constant.KEY_LOGIN_TOKEN, '');if (mDialog != null) { mDialog.hide(); mDialog = null;}mDialog = new MaterialDialog.Builder(this).canceledOnTouchOutside(false).title('提示').content('賬號已在其他地方登錄,請退出重新登錄!').positiveText('確定').onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {AppManager.getInstance().finishAllActivity();Intent intent = new Intent(mActivity, LoginActivity.class);startActivity(intent);finish(); }}).show(); } private void onNavigateUpClicked() {onBackPressed(); } //開始contentLayout前調整布局(子類若有需要可以單獨復寫) public void onAdjustLayout() { }//下面這5個方法是子類必須實現(xiàn)的,分別是layout布局、toolbar、mvp的persenter初始化、//onCreate內(nèi)的initData、以及頁面銷毀的onDestroyActivity(可以根據(jù)自己的需要添加) public abstract int setContentLayout(); public abstract void initToolBar(); public abstract void initPresenter(); public abstract void initData(Bundle savedInstanceState); public abstract void onDestroyActivity();}3.3.注意點 在BaseActivity的每個生命周期內(nèi)都有l(wèi)og日志,這里是方便觀察執(zhí)行到activity的哪個生命周期,logcat也可以簡單封裝一下,統(tǒng)一控制日志是否打印。 BaseActivity并不適合每一個頁面的Activity,比如進入應用的閃屏頁面,就可以考慮不繼承BaseActivity,因為這個頁面通常不需要寫太多代碼。或者還有其他特殊的業(yè)務場景下。 需要注意一個Dialog彈窗問題,在BaseActivity里面,每次show一個dialog的時候我都是創(chuàng)建一個新的對象,那么就要注意dialog在未關閉之前不能再去show,否則可能會導致dialog出現(xiàn)異常。但是不要在onDestory方法里面去隱藏dialog彈窗,因為在A頁面進入B頁面的時候,會先執(zhí)行到B頁面生命周期的onCreate、onStart、onResume三個方法,然后再執(zhí)行A頁面的onStop可能還有onDestory方法,所以等B頁面加載完成再去銷毀A頁面是錯誤的。 有時候為了方便可能有人會把請求Android中權限檢測的方法放在BaseActivity里面,這樣并不是特別合適,因為所有繼承自BaseActivity的頁面都會去檢測權限,這樣會導致用戶體驗差,所以建議用到權限的地方再去請求,最好自己封裝一個工具類,用起來方便一點。 BaseActivity的封裝并不強求子類必須實現(xiàn)activity生命周期相關的方法,除了幾個抽象方法(我認為子類需要復寫的,可以根據(jù)業(yè)務自己定),必要的話可以自己復寫。4.總結

不是很復雜,寫的也比較詳細,也基本適用于絕大部分的場景。可能還有其他需要注意的細節(jié)回頭想起來再補上。

以上就是詳解Android封裝一個全局的BaseActivity的詳細內(nèi)容,更多關于Android封裝BaseActivity的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美三级| 激情久久婷婷| 午夜天堂精品久久久久| 一区二区亚洲视频| 亚洲精品九九| 91国内精品| 里番精品3d一二三区| 三上亚洲一区二区| 99成人超碰| 亚洲欧美成人综合| 日韩av中文字幕一区二区| 国产精品2区| 欧洲一区二区三区精品| 久久国产亚洲| 综合亚洲色图| 日韩精品视频一区二区三区| 麻豆国产一区| 极品裸体白嫩激情啪啪国产精品| 免费成人在线影院| 老牛国内精品亚洲成av人片| 国内亚洲精品| 日韩精选在线| 日产精品一区| 亚洲欧美专区| 国产乱码午夜在线视频| 亚洲色图网站| 日本久久精品| 蜜臀国产一区二区三区在线播放| 欧美日韩伊人| 欧美日韩水蜜桃| 天堂va欧美ⅴa亚洲va一国产| 久久久久观看| 亚洲一级在线| 黄色网一区二区| 另类激情亚洲| 91亚洲成人| 午夜视频一区二区在线观看| 欧美激情三区| 国产精品老牛| 国产成人精品一区二区免费看京 | 国产欧美一区二区三区米奇| 精品中文在线| 久久电影一区| 日本欧美国产| 日韩成人午夜精品| 五月天久久久| 国产精品亚洲成在人线| 亚洲国产不卡| 日韩综合一区| 日韩av电影一区| 免费精品国产的网站免费观看| 欧美久久精品| 亚洲综合日韩| 久久影院一区| 国产精品xx| 国产另类在线| 久久最新视频| 亚洲大片在线| 国产不卡一区| 国产精品美女在线观看直播| 蜜桃久久av一区| 蜜桃视频欧美| 日韩专区精品| 日本一二区不卡| 国产精品欧美三级在线观看 | 成人看片网站| 国产在线观看91一区二区三区| 日本一区免费网站| 日韩午夜在线| 欧美丰满日韩| 国产一区二区三区日韩精品| 日本v片在线高清不卡在线观看| 国产视频一区在线观看一区免费| 久久黄色影院| 国产v综合v| 97国产精品| 成人在线免费观看91| 国产精品对白久久久久粗| 亚洲精品看片| 亚洲免费福利一区| 蜜臀va亚洲va欧美va天堂 | 少妇精品久久久一区二区三区| 激情久久久久久久| 视频小说一区二区| 国产白浆在线免费观看| 麻豆高清免费国产一区| 国产美女亚洲精品7777 | 日韩av中文字幕一区二区| 亚洲资源网站| 亚洲日本三级| 日韩在线网址| 日本欧美在线| 日韩不卡手机在线v区| 日韩不卡在线观看日韩不卡视频| 香蕉成人久久| 99国内精品| 久久国产亚洲| 欧美日韩中文一区二区| 亚洲天堂黄色| 91久久午夜| 只有精品亚洲| 欧美亚洲福利| 美日韩一区二区三区| 美女性感视频久久| 日韩在线短视频| 激情丁香综合| 视频精品一区二区| 日韩高清电影免费| 国产精品v日韩精品v欧美精品网站| 91精品国产经典在线观看| 国产精品一区二区美女视频免费看| 国产乱码精品一区二区三区亚洲人| 麻豆传媒一区二区三区| 国产美女高潮在线观看| 久久国产毛片| 亚洲深深色噜噜狠狠爱网站 | 欧美日韩中出| 国产aⅴ精品一区二区三区久久| 国产色播av在线| 欧洲亚洲一区二区三区| 欧美日韩激情| 亚洲精品无播放器在线播放| 国产日韩欧美三级| 久久永久免费| 国产精品97| 亚洲不卡视频| 精品视频在线你懂得| 亚洲韩日在线| 亚洲人成高清| 欧美1区二区| 欧美日韩国产高清电影| 日韩av在线免费观看不卡| 国产一区二区三区四区二区| 伊人久久成人| 国产毛片精品久久| 私拍精品福利视频在线一区| 亚洲精品日本| 日韩中文字幕高清在线观看| 欧美一级专区| 国产精品白丝久久av网站| 久久人人97超碰国产公开结果| 天堂va欧美ⅴa亚洲va一国产| 狂野欧美性猛交xxxx| 蜜臀91精品国产高清在线观看| 视频国产精品| 青青青免费在线视频| 一区二区国产在线观看| 精品欧美视频| 久久国产福利| 日本黄色精品| 日韩精品午夜视频| 激情欧美一区| 精品淫伦v久久水蜜桃| 女人天堂亚洲aⅴ在线观看| 欧美日韩一区二区三区在线电影| 久久精品在线| 国产福利亚洲| 蜜臀久久99精品久久久久久9| 成人一区而且| 日韩成人在线看| 99视频精品免费观看| 国产一区二区三区精品在线观看 | 日韩精品一区二区三区免费观看| 日本国产欧美| 女主播福利一区| 国产一区二区视频在线看| 午夜欧美精品久久久久久久| 麻豆精品在线观看| 蜜臀久久99精品久久久画质超高清| 伊伊综合在线| 免费看一区二区三区| 亚洲18在线| 亚洲精品va| caoporn视频在线| 欧美黑人做爰爽爽爽| 日韩欧美久久| 一区在线视频观看| 神马午夜久久| 成人精品久久| 麻豆极品一区二区三区| 日本午夜精品一区二区三区电影| 婷婷国产精品| av中文字幕在线观看第一页| 国产精品视频一区二区三区综合 | 亚洲在线观看| 日韩欧美二区| 精品美女在线视频| 国产探花一区| 少妇高潮一区二区三区99| 国产日韩综合| 免费观看不卡av| 欧美亚洲国产精品久久| 日韩不卡免费高清视频| 精品国产三区在线| 欧美私人啪啪vps| 日韩国产高清在线| 综合激情网...| 蜜臀av亚洲一区中文字幕| 午夜在线一区| 一区二区三区国产在线|