読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

AndroidのActivity Aliasを活用する

Android

概要

AndroidManifestで指定できる、Activity Aliasを使って以下のことを実現する

IntentFilterのaction名ごとにアイコンや名前を変える
Activityの起動モードを条件ごとに使い分ける

詳細

Activity Alias

Activity Aliasとは名前の通り、Activityのエイリアスのこと
AndroidManifest上で、Activity-aliasタグで指定することに定義することが出来る

	<activity
        android:name="com.example.androidtest.MainActivity"></activity>

    <activity-alias 
        android:name="com.example.androidtest.NewActivity"
        android:targetActivity="com.example.androidtest.MainActivity"/>

これでMainActivityは、MainActivity,NewActivity両方で呼び出すことが出来るようになる
元のActivityはエイリアスの前に宣言する必要があるが、Activity Aliasには元のActivityとは別のIntent-filterや属性を指定することが出来る

このActivity Aliasを使用することにより色々と便利なことが可能になる

IntentFilterのaction名ごとにアイコンや名前を変える

通常、1つのActivityに複数のIntent-Filterがあると、どのIntent-FIlterから起動してもアイコンや名前はすべて同じになる
しかし、1つのアプリに複数の機能を実装している場合、呼び出す機能ごとにアプリ名やアイコンをかえたい場合がある
そんな場合、activity-aliasを使って別々のintent-filterをつけることによりaction名ごとに別のアイコンや名前を定義できる

標準のカメラアプリは一つのアプリでビデオとカメラを実装しているが、Actioo名によりアプリ名をわけている
標準カメラアプリのAndroidManifestの定義は以下のようにして、ビデオ時とカメラ時のアプリ名、アイコンをわけている。

<!-- camraオリジナルのActivity -->
<activity
    android:name="com.android.camera.CameraActivity"
    android:label="@string/app_name"
    android:logo="@mipmap/ic_launcher_gallery"
    android:taskAffinity="com.android.camera.CameraActivity"
    android:theme="@style/Theme.Camera"
    …>
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter></activity>

<!-- cameraAcitivityに別名をつけてVIDEO系のaction系を処理している -->
<activity-alias
    android:name="com.android.camera.VideoCamera"
    android:icon="@mipmap/ic_launcher_video_camera"
    android:label="@string/video_camera_label"
    android:targetActivity="com.android.camera.CameraActivity">
    <intent-filter>
        <action android:name="android.media.action.VIDEO_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.media.action.VIDEO_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity-alias>

Activityの起動モードを条件ごとに使い分ける

Acitivityの起動モードがSingleTopにも関わらず、特例として別のインスタンスとして同じActivityをcallしたい時に便利
例えば、Android標準のメッセージアプリは編集画面(ComposeMessageActivity)は二重に起動する必要がないので、起動モードがSingleTopになっている
しかし、編集画面から転送画面として同じ編集が面を起動したい契機がある
この場合転送画面と編集画面が同じActivityでsingleTopなので、転送画面に遷移した後バックキーを押した際、編集画面に戻ってくれなくなる
転送時に編集画面(ComposeMessageActivity)をcallする時は、起動モードをstandard(指定無しのデフォルト)にして呼び出す必要があるので、Activity aliasを使って以下のように指定する

<activity android:name=".ui.ComposeMessageActivity"
    android:launchMode="singleTop"
    …>
</activity>

<activity-alias android:name=".ui.ForwardMessageActivity"
    android:targetActivity=".ui.ComposeMessageActivity"
    …>
</activity-alias>

参考
AndroidManifest.xml - platform/packages/apps/Camera2 - Git at Google
SimpleSMS/MMS Manifest.xml at master · niothiel/SimpleSMS · GitHub

良いAndroidアプリを作る139の鉄則

良いAndroidアプリを作る139の鉄則