詳解Android封裝一個(gè)全局的BaseActivity
下面會(huì)討論哪些代碼應(yīng)該放在BaseActivity里面,哪些需要謹(jǐn)慎
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)一將一個(gè)activity添加到一個(gè)集合里面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'); } /** * 顯示一個(gè)Fragment */ public void showFragment(Fragment fragment) {if (fragment != null && fragment.isHidden()) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.show(fragment); fragmentTransaction.commit();} } /** * 隱藏一個(gè)Fragment */ public void hideFragment(Fragment fragment) {if (fragment != null && !fragment.isHidden()) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.hide(fragment); fragmentTransaction.commit();} }//這是一個(gè)設(shè)置toolbar標(biāo)題欄的方法,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();} });} }//子類直接調(diào)用展示toast public void showToast(String s) {ToastUtil.showToast(this, s); }//給子類提供一個(gè)獲取activity對(duì)象的方式 public Activity getActivity() {return this; }//一個(gè)彈窗l(fā)oading庫(kù) 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相關(guān)的邏輯,可以根據(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('賬號(hào)已在其他地方登錄,請(qǐng)退出重新登錄!').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(); } //開(kāi)始contentLayout前調(diào)整布局(子類若有需要可以單獨(dú)復(fù)寫) public void onAdjustLayout() { }//下面這5個(gè)方法是子類必須實(shí)現(xiàn)的,分別是layout布局、toolbar、mvp的persenter初始化、//onCreate內(nèi)的initData、以及頁(yè)面銷毀的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.注意點(diǎn) 在BaseActivity的每個(gè)生命周期內(nèi)都有l(wèi)og日志,這里是方便觀察執(zhí)行到activity的哪個(gè)生命周期,logcat也可以簡(jiǎn)單封裝一下,統(tǒng)一控制日志是否打印。 BaseActivity并不適合每一個(gè)頁(yè)面的Activity,比如進(jìn)入應(yīng)用的閃屏頁(yè)面,就可以考慮不繼承BaseActivity,因?yàn)檫@個(gè)頁(yè)面通常不需要寫太多代碼?;蛘哌€有其他特殊的業(yè)務(wù)場(chǎng)景下。 需要注意一個(gè)Dialog彈窗問(wèn)題,在BaseActivity里面,每次show一個(gè)dialog的時(shí)候我都是創(chuàng)建一個(gè)新的對(duì)象,那么就要注意dialog在未關(guān)閉之前不能再去show,否則可能會(huì)導(dǎo)致dialog出現(xiàn)異常。但是不要在onDestory方法里面去隱藏dialog彈窗,因?yàn)樵贏頁(yè)面進(jìn)入B頁(yè)面的時(shí)候,會(huì)先執(zhí)行到B頁(yè)面生命周期的onCreate、onStart、onResume三個(gè)方法,然后再執(zhí)行A頁(yè)面的onStop可能還有onDestory方法,所以等B頁(yè)面加載完成再去銷毀A頁(yè)面是錯(cuò)誤的。 有時(shí)候?yàn)榱朔奖憧赡苡腥藭?huì)把請(qǐng)求Android中權(quán)限檢測(cè)的方法放在BaseActivity里面,這樣并不是特別合適,因?yàn)樗欣^承自BaseActivity的頁(yè)面都會(huì)去檢測(cè)權(quán)限,這樣會(huì)導(dǎo)致用戶體驗(yàn)差,所以建議用到權(quán)限的地方再去請(qǐng)求,最好自己封裝一個(gè)工具類,用起來(lái)方便一點(diǎn)。 BaseActivity的封裝并不強(qiáng)求子類必須實(shí)現(xiàn)activity生命周期相關(guān)的方法,除了幾個(gè)抽象方法(我認(rèn)為子類需要復(fù)寫的,可以根據(jù)業(yè)務(wù)自己定),必要的話可以自己復(fù)寫。4.總結(jié)
不是很復(fù)雜,寫的也比較詳細(xì),也基本適用于絕大部分的場(chǎng)景??赡苓€有其他需要注意的細(xì)節(jié)回頭想起來(lái)再補(bǔ)上。
以上就是詳解Android封裝一個(gè)全局的BaseActivity的詳細(xì)內(nèi)容,更多關(guān)于Android封裝BaseActivity的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 詳解瀏覽器的緩存機(jī)制2. 微信開(kāi)發(fā) 網(wǎng)頁(yè)授權(quán)獲取用戶基本信息3. asp批量添加修改刪除操作示例代碼4. jsp實(shí)現(xiàn)登錄驗(yàn)證的過(guò)濾器5. HTML5 Canvas繪制圖形從入門到精通6. css代碼優(yōu)化的12個(gè)技巧7. jsp EL表達(dá)式詳解8. msxml3.dll 錯(cuò)誤 800c0019 系統(tǒng)錯(cuò)誤:-2146697191解決方法9. jsp+servlet簡(jiǎn)單實(shí)現(xiàn)上傳文件功能(保存目錄改進(jìn))10. .NET SkiaSharp 生成二維碼驗(yàn)證碼及指定區(qū)域截取方法實(shí)現(xiàn)
