
最も単純なケースでは、Androidでアクティビティを起動するには、呼び出されたアクティビティのクラスとパラメーターからのバンドルでインテントを作成する必要があります。 アプリケーションにいくつかの画面がある限り、すべてが順調です。 困難は、アプリケーションの画面の数が数十になると始まります。 この記事では、多くのアクティビティで作業を整理する比較的簡単な方法を提供したいと思います。
はじめに
会話をより実質的にするために、アプリケーションには少なくとも3つのアクティベーションがあると仮定します。
- ドキュメントのリストDocumentsList。 パラメータなしで起動してすべてのドキュメントを表示するか、int categoryIdパラメータを使用してこのカテゴリのドキュメントを表示できます。
- DocumentViewドキュメントを表示します。 既存のドキュメントを表示するために、UUIDパラメーターdocumentIdでのみ呼び出されます。
- DocumentEditドキュメントエディタ。 パラメーターなしで呼び出され、新しいドキュメントを作成するか、UUIDパラメーターdocumentIdを使用して既存のドキュメントを編集します。
問題
これは、Intentインスタンスがアクティビティコードで直接作成される標準的なアプローチの主な欠点です。 これはコードの重複です。 アクティベーションコールにもう1つのパラメーターを追加する場合、このアクティベーションが呼び出されるすべての場所を変更する必要があります。 アプリケーションが複数の人によって開発されている場合は、変更をチーム全体に通知する必要があります。 あるアクティビティを別のアクティビティに置き換える必要がある場合は、再びすべての発生を探す必要があります。 そして、とにかく、風水ではありません。
解決策
だから、私はあなたができるいくつかのオブジェクトを取得したいと思います:
- 呼び出されたアクティビティのクラスを明示的に指定せず、インテントを明示的に作成せずにアクティビティを呼び出します。
- あるアクティビティを別のアクティビティに置き換えます。
- 既存のアクティビティの呼び出しパラメータを変更します。
メディエーターパターンはこの説明に適合します。 今では実装次第です。
実装
クラス図は、記事の冒頭に記載されています。 まず、各クラスをより詳細に検討します。
MyIntentクラスには、アクティビティ呼び出しパラメーターの定数が格納されます。
public class MyIntent extends Intent { public static final String EXTRA_CATEGORY_ID = "CategoryId"; public static final String EXTRA_DOCUMENT_ID = "DocumentId"; }
ActivityMediatorクラスは、このクラスのアクティビティのエクスポートを実装します。 コンストラクターは現在のアクティビティを受け入れ、プライベートフィールドに保存します。 2つの保護されたメソッドは、このクラスでアクティビティを呼び出します。 これらのメソッドは、直接呼び出す誘惑を避けるために保護されています。
public class ActivityMediator { private Activity mActivity; public ActivityMediator(Activity activity){ mActivity = activity; } protected void startActivity(Class<?> cls){ Intent intent = new Intent(mActivity, cls); mActivity.startActivity(intent); } protected void startActivity(Class<?> cls, Bundle extras){ Intent intent = new Intent(mActivity, cls); intent.replaceExtras(extras); mActivity.startActivity(intent); } }
ActivityMediatorクラスから、MyActivityMediatorクラスを継承します。
public class MyActivityMediator extends ActivityMediator { public MyActivityMediator(Activity activity){ super(activity); } public void showDocumentsList(){ startActivity(DocumentsListActivity.class); } public void showDocumentsList(int categoryId){ Bundle bundle = new Bundle(); bundle.putInt(MyIntent.EXTRA_CATEGORY_ID, categoryId); startActivity(DocumentsListActivity.class, bundle); } public void showDocumentViewer(UUID documentId){ Bundle bundle = new Bundle(); bundle.putString(MyIntent.EXTRA_DOCUMENT_ID, documentId.toString()); startActivity(DocumentViewActivity.class, bundle); } public void showDocumentEditor(){ startActivity(DocumentEditActivity.class); } public void showDocumentEditor(UUID documentId){ Bundle bundle = new Bundle(); bundle.putString(MyIntent.EXTRA_DOCUMENT_ID, documentId.toString()); startActivity(DocumentEditActivity.class, bundle); } }
MyActivityクラスは抽象クラスであり、プロジェクト内の他のすべてのアクティビティはこのクラスから継承されます。
public abstract class MyActivity extends Activity { private KadActivityMediator mActivityMediator = new KadActivityMediator(this); public KadActivityMediator getActivityMediator(){ return mActivityMediator; } }
これで、アプリケーションのどのアクティビティでも、他のアクティビティを呼び出すことができます。 たとえば、エディターを呼び出して新しいドキュメントを作成できます。
getActivityMediator().showDocumentEditor();
など-選択したドキュメントを表示する
UUID documentId = getCurrentDocumentId(); getActivityMediator().showDocumentViewer(documentId);
おわりに
この記事では、メディエーターパターンを使用して、Android OSのさまざまなアクティビティで作業を整理する例を示しました。 このアイデアを発展させるために、startActivityForResultへの呼び出し、またはアクションに基づくアクティベーション呼び出しを追加できます。