AndroidパッケージのグローバルBaseActivity
10082 ワード
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を貼ります。コードとコードの下で説明しました。 は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に関する資料です。他の関連記事に注目してください。
3.1.長所と短所
以下ではどのコードが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.注意点あまり複雑ではないです。詳しく書いても、ほとんどのシーンに適用されます。他に注意すべき細かい点があるかもしれません。後で思い出して追加します。
以上はAndroidパッケージのグローバルBaseActivityの詳細を詳しく説明しました。もっと多いのはAndroidパッケージBaseActivityに関する資料です。他の関連記事に注目してください。