[Android]URLを指定するみたいにアクティビティを起動する
routable-androidとは
routable-androidとは、Androidアプリ内で使用可能なURLを作成するためのルーターです。 例えば、「/foo」というURLと特定のActivityをマッピングし、URLを指定して起動させることができます。 また、「foo/:param」のように、パラメータを渡すこともできます。
環境
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- Android OS : 4.1.1
まずはroutable-androidを取得しましょう。
% git clone https://github.com/usepropeller/routable-android.git
cloneしたディレクトリをAndroid Liblaryプロジェクトとして参照するか、 Router.javaを任意のプロジェクトにコピーすれば使用することができます。
サンプルを作成して試してみる
適当なAndroidプロジェクトを作成し、「UserActivity」と「BookActivity」を追加しましょう。 デフォルトで作成されたMainActivityに対して次のような記述を追加します。
・ ・ ・ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //ルーティング情報を定義 Router.sharedRouter().setContext(getApplicationContext()); Router.sharedRouter().map("users/:id", UserActivity.class); Router.sharedRouter().map("books/:name/:category", BookActivity.class); setContentView(R.layout.activity_main); } //ボタンクリック時にUserActivityを開く public void clickUser(View view) { Router.sharedRouter().open("users/100"); } //ボタンクリック時にBookActivityを開く public void clickBook(View view) { Router.sharedRouter().open("books/akudagawa/ShortStory"); } ・ ・ ・
基本的な使い方は簡単で、Router.sharedRouter().map関数でURLとアクティビティをマッピングし、 Router.sharedRouter().open関数でアクティビティを起動させます。
上記サンプルでは、MainActivity作成時に他のアクティビティへのルーティング情報を定義しています。 また、:を使用して、パラメータを渡せるようにもしています。 cliclUserとclickBookは、activity_mainに配置したボタンクリック時に起動するメソッドです。 layout/activity_main.xmlにボタンを配置し、android:onClickでこれらの関数が起動するようにしておいてください。
UserActivityは下記のようになっています。 URLで指定されたパラメータは、Bundleを通じて取得できます。
・ ・ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //パラメータを取得 Bundle intentExtras = getIntent().getExtras(); String userId = (String) intentExtras.get("id"); Log.d("PARAM", "userId = " + userId); setContentView(R.layout.activity_user); } ・ ・
BookActivityです。パラメータが複数あっても同じように取得できます。
・ ・ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //パラメータを取得 Bundle intentExtras = getIntent().getExtras(); String name = (String) intentExtras.get("name"); String category = (String) intentExtras.get("category"); Log.d("PARAMS", "name = " + name + ",category = " + category); setContentView(R.layout.activity_book); } ・ ・
このライブラリを使用すると、アクティビティの関連が1箇所にまとめられるので、管理が楽になりますね。