そーす

福岡在住のプログラマ。SwiftとかKotlinとかJavascriptとかSketchとか触ってます。

Android Intent-filterのマッチングについて

RESTfulなAPIならこの仕様だと困らないか?って話。

とりあえず、AndroidのIntent-filterのパスマッチングの仕様について。

固定Uriでのマッチング

http://saburesan.hatenablog.com でIntentが発行された時にMainActivityを起動したい時

        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="saburesan.hatenablog.com"
                    android:path="/"
                    android:scheme="http://" />
            </intent-filter>
        </activity>

Pathの前方一致でのマッチング

http://saburesan.hatenablog.com/blog/* でIntentが発行された時にMainActivityを起動したい時

        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="saburesan.hatenablog.com"
                    android:pathPrefix="/blog"
                    android:scheme="http://" />
            </intent-filter>
        </activity>

Pathの部分マッチング

http://saburesan.hatenablog.com//hoge/ でIntentが発行された時にMainActivityを起動したい時(これ需要あるんかな)

        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="saburesan.hatenablog.com"
                    android:pathPattern=".*hoge.*"
                    android:scheme="http://" />
            </intent-filter>
        </activity>

.(ドット)は任意の文字、(アスタリスク)は1つ前の文字の0個以上の文字列。.で任意の文字列を表す。

RESTfulなAPIだと困る

実際にあったんだけど例えば、ユーザ詳細へのURLが

https://sabure.com/users/124

だったとして、そのユーザのfollowerが

https://sabure.com/users/124/followers

だとして、これら2つに別々のIntent-filterを設定したいとする。

ユーザ詳細なら

android:pathPrefix="/users"
or
android:pathPattern="/users/.*"

followerなら

android:pathPattern="/users/.*/followers"

になる。 一見うまくいきそうだけど、これだとfollwerの方法URLにユーザ詳細も引っかかってしまう。

うーむ、マッチングがこんなにも貧弱なわけないんだけどなー… これだと使い物にならんし。 リファレンス見たけど、.*くらいしか使えなそうだし。

うーむ、なんなんだろ。