AndroidパッケージのグローバルBaseActivity


1.はじめに
  • はAndroidの開発者にとって、各ページに別々のシステムActivityを継承しています。必要でない悩みをたくさん持ってきます。例えば、各ページには重複コードがあります。読むのが面倒くさいです。新しいページ機能を書くたびに、もとのページコードを開いてコピーしてきます。時にはコードデバッグで問題を調べるのも不便です。
  • もしあなたのプロジェクトの中でActivityをすべて自分のパッケージから引き継いでいないならば、あるいは自分のパッケージに対するBaseActivityはまだ完璧ではないと感じています。このブログはあなたに役立つかもしれません。
  • 2.特徴
  • カプセル化:すべてのActivityに使用されているコードの一部を一つの統制されたActivity類(全部BaseActivityと名付けられています。)にパッケージ化し、このBaseActivityからAndroidシステムのAppCompCompantActivity(一般的にはこれです。)を引き継ぎます。
  • 継承:ページで使用するActivityはすべて私達の自分のBaseActivityから継承して、BaseActivityパッケージの方法はActivity内で直接呼び出します。
  • 3.コードと説明
    3.1.長所と短所
  • の利点:コードの繰り返しを減少させ、コードの書き込み効率を向上させ、コードの維持性を向上させた。
  • 欠点:任意のコードをBaseActivityに置かないと、BaseActivityがあまりにも肥大してしまい、コードの読み取りとメンテナンスに不利になり、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;
            //     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() {
                    @Override
                    public 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;
        }
    
    	//    loading  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     ,               
        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           ,   layout  、toolbar、mvp persenter   、
    	//onCreate  initData、       onDestroyActivity(           )
        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のライフサイクルごとにログログログを持っています。ここではactivityのどのライフサイクルを実行するかを観察しやすいです。logcatも簡単にカプセル化して、統一制御ログが印刷されていますか?
  • BaseActivityは各ページのActivityに適合していません。例えば、アプリケーションのフラッシュ画面に入ると、BaseActivityを継承しないことが考えられます。このページは通常あまりコードを書く必要がないからです。あるいは他にも特殊なビジネスシーンがあります。
  • はDialogの弾き窓の問題に注意しなければなりません。BaseActivityでは、ショーのたびにdialogを作成する時、新しい対象を作成します。dialogは閉まらない前にショーに行けないので、そうでないとdialogに異常が発生する可能性があります。しかし、onDestoryメソッドにdialogの弾戸を隠すのではなく、AページがBページに入るときは、まずBページライフサイクルのonCreate、onstart、onResumeの3つの方法を実行してからAページのonStopを実行すると、on Destoryの方法があるかもしれないので、Bページのロードが完了したらAページを破棄するのは間違っています。
  • 時には、Androidにおける権限検出を要求する方法をBaseActivityに置くことがあります。これは特に適切ではありません。BaseActivityのページから権限を継承するすべてのページが検出されますので、ユーザの体験が悪くなります。権限のあるところで再度要求してください。使いやすいです。
  • BaseActivityのパッケージは強くないです。子供類はactivityライフサイクルに関する方法を実現しなければならないです。いくつかの抽象的な方法を除いて、必要ならば自分で複写できます。
  • 4.まとめ
    あまり複雑ではないです。詳しく書いても、ほとんどのシーンに適用されます。他に注意すべき細かい点があるかもしれません。後で思い出して追加します。
    以上はAndroidパッケージのグローバルBaseActivityの詳細を詳しく説明しました。もっと多いのはAndroidパッケージBaseActivityに関する資料です。他の関連記事に注目してください。