Asial Blog

Recruit! Asialで一緒に働きませんか?

【Android】はじめてのカスタムURLスキーム

カテゴリ :
バックエンド(プログラミング)
タグ :
Android
こんにちは、Monacaチームの細井です。
あいかわらず、Android一本で仕事をしています。(アシアル社員だとは思えない

さて、今回は、AndroidでカスタムURLスキームを使ってみた、という内容をお送りします。
何故、今更そんな昔からある話を?というと、Monacaデバッガーの新機能で使うことになったからです。


カスタムURLスキームとは?



iOS/Android問わず存在する仕組みですが、アプリを別アプリやブラウザを起動する仕組みになります。
起動時にパラメータを渡せるので、起動後に通常とはことなる処理をさせるといったこともできます。


サンプル



「カスタムURLスキーム android」でググると大量に出てきますので、最低限のサンプルとして、ブラウザのリンクからIDを渡しつつ、アプリを起動する方法を紹介します。

html

  1. <a href="hoge-scheme://hoge-host?id=hogehogehoge">アプリ起動</a>

AndroidManifest

  1. <activity
  2.     android:name="com.hoge.SchemeActivity"
  3.     ...
  4.     <intent-filter>
  5.         <action android:name="android.intent.action.VIEW" />
  6.         <category android:name="android.intent.category.DEFAULT" />
  7.         <category android:name="android.intent.category.BROWSABLE" />
  8.         <data android:scheme="hoge-scheme" android:host="hoge-host" />
  9.     </intent-filter>
  10. </activity>

schemeとhostが同じアプリが複数存在する場合、Androidはどのアプリを起動するか選択することができます。
が、iOSは条件不明ですが、いずれかのアプリが自動的に選択され起動するようです。

QRコードリーダ等のアプリからは「android.intent.category.BROWSABLE」を指定しなくても起動できるので、ブラウザで表示したページから起動したくない場合は、記載しないようにしておきましょう。

SchemeActivity

  1. // uriに「hoge-scheme://hoge-host?id=hogehogehoge」が入る
  2. Uri uri = activity.getIntent().getData();
  3. // パラメータで指定したhogehogehogeが取得できる
  4. String id = uri.getQueryParameter("id");


ひっかかったポイント



カスタムURLスキームに限った問題では無いですが、Androidで別アプリ(タスク)からActivityを呼び出す際は、Activityの保持状態に気をつけなければいけません。
Monacaデバッガーは、これまで別アプリとの連携がなかったこともあり、タスクが必ず1つである前提で作られていたため、そのまま別アプリから起動すると問題がいくつか発生しました。

例えば、QRコードリーダアプリでスキームを読み取って起動しようとすると、リーダアプリのタスク上にMonacaのActivityが起動してしまいました。



リーダアプリがstartActivityしているようです。
AndroidManifestでスキームを指定したActivityにlaunchMode="singleTask(singleInstance)"を設定しましょう。

その他にも、別アプリからActivityを起動した後、ホームのアイコンからアプリを起動した時に、同じActivityが重複してしまったりしました。
以外と嵌ってしまい、各Activityの遷移や破棄のタイミングを確認しながら、launchModeやintent.setFlags()を設定していく羽目になりました。

※タスクとActivityの話は、このページが分かりやすいです。
Androidの開発をされている方は、このlaunchModeの表を見たことある方も多いんじゃないでしょうか。
http://y-anz-m.blogspot.jp/2011/02/androidlauchmode.html


おわりに



カスタムURLスキームを使った新機能は近日リリース予定です!