0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Action名やExtraのKey名はどうやって定義するのがよいか?

Last updated at Posted at 2021-10-03

Intentに付与するAction名やExtraのKey名をアプリ独自で定義する場合、どういう値を定義すればいいのか、独自なのでどうとでも定義できてしまうため悩んでしまいますよね。
また、外部に公開する場合、アプリ間プロトコルの定義になりますので、一度適用してしまうと変更不可能という、取り返しのつかない設計要素です。将来を見据えて慎重に決める必要があります。

というわけで、どうやって決めればいいのかを説明しようと思います。

アプリ外部に公開する場合

Intentを使ったインターフェースをアプリ外部に提供し、独自のActionを定義する場合は、他のAction名と重複しないように、パッケージ名などをプレフィックスとしてつけた名前を定義するのが良いでしょう。アプリ外部に提供する場合、それが機能を識別するためのIDになりますので、他のアプリで使用される名前と衝突すると問題が発生してしまいますからね。

プレフィックスの後の名前は自由につけて良いです。アプリ内のシンボル名として、ACTION_HOGEHOGEという名前で定義することが多いと思うので、それをそのままつけても良いと思います。

object Constants {
    const val ACTION_HOGEHOGE = "com.android.myapplication.ACTION_HOGEHOGE"
}

例えば、Intent.ACTION_VIEWの値は android.intent.action.VIEWの用にactionをプレフィックス的に使うように定義されていますね。なので、これに習って

object Constants {
    const val ACTION_HOGEHOGE = "com.android.myapplication.action.HOGEHOGE"
}

とするのも良いでしょう。HOGEHOGEをアッパースネークケースとする場合や、クラス名のようにアッパーキャメルケースにする場合もあるようです。Googleが提供している機能でも統一されていないので、アプリ内で混乱しないルールを適用すれば良いと思います。

アプリとしてはAndroidManifestにintent-filterを定義することになりますね。

AndroidManifest.xml
<intent-filter>
    <action android:name="com.android.myapplication.action.HOGEHOGE" />
</intent-filter>

プレフィックスはアプリのパッケージ名で良いと思いますが、識別するのは機能名なので、複数のアプリが同様の機能を提供するような場合は、その機能を提供するライブラリのGroupIDなどを利用した方がよいかもしれません。

参考になるのは、Custom Tabsに対応したブラウザーアプリで使用されるCustomTabsServiceのAction名ですね。サポートライブラリのGroupIDに基づいたプレフィックスがついています。

AndroidManifest.xml
<intent-filter>
    <action android:name="android.support.customtabs.action.CustomTabsService" />
</intent-filter>

ここで気をつけなければいけないのが、アプリ外部に公開した独自Action名は、一度つけてしまうと変更が不可能である点です。
アプリ外部から利用してもらうのですから、対応している外部アプリすべてを同時に修正しないと連携機能が動作しなくなってしまいます。どうしても変更する必要がある場合は、リネーム前と後両対応しておき、外部アプリに変更対応をお願いし、対応がすみ、十分に浸透してから~という手順を踏むことになるでしょうが、そこまでしてリネームするメリットがあるとも思えないので変更しないのが通常です。
上記Custom Tabsを提供するライブラリのGroupIDは、androidx.browserという名前に変わっていますが、アクション名が旧ライブラリのプレフィックスのままなのはそういう理由です。

一方、ExtraのKey名については、Manifestに記述される要素ではなく、Action名などのintent-filterに基づくフィルタリングを行った後に参照されるものですね。Action名などの要素ですでに名前空間が分かれている状態ですので、必ずしもプレフィックスは必要なく、わかりやすく、その機能内で重複しない名前なら何でも良いと思います。
EXTRA_HOGEHOGEという名前で定義することが多いと思うので、私はその名前をそのまま使っています。

object Constants {
    const val EXTRA_HOGEHOGE = "EXTRA_HOGEHOGE"
}

アプリ内で閉じている場合

前項と違って、アプリ内に閉じている場合、他のアプリから使うわけでもなく、呼び出し先のComponent名を検索することなく明示的に指定することになりますので、プレフィックスなどをつける必要は無くなります。もちろんつけても問題はありませんが。
アプリ内でグローバルな値として定義しておく必要も無く、呼び出し処理を呼び出し先のクラスに定義するようにすれば、privateな定数で十分ということになります。この辺は以下を参照。

Activityの起動処理は起動されるActivityで実装すべし

定義の範囲が広がってしまうと不必要な複雑さを生んでしまうため、アプリ内部だけで利用する場合は、privateな定数として定義できるようにした方が良いですね。

単純にActivityを呼び出すような場合はそれほど制約はありませんが、PendingIntentを使ったりする場合は、前のバージョンのIntentを受け取ってしまう可能性があるため、こちらも同様に一度決めたAction名やExtraのKey名は安易に変更しない方が良いです。


以上です。

私が初めて作ったアプリでは外部アプリとの連携機能も作ったのですが、この辺のルールが分からず結構滅茶苦茶な命名をしてしまって後悔しています。参考になれば。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?