はじめに
特定のWebサイトを、ブラウザのブックマークからではなく、ホーム画面やドロワーから直接「独立したアプリ」のように起動したいと思ったことはありませんか?
Progressive Web Apps (PWA) に対応していないサイトでも、お気に入りのアイコンと名前で管理したい。そんな思いから、Android向けWebランチャーアプリ**「らん茶 (WebLauncher)」**を開発しました。
アプリ概要
「らん茶」は、Androidのホーム画面やドロワーに、最大5つの独立したWebランチャーアイコンを追加できるアプリです。
- お茶缶デザイン: 静岡生まれの「お茶缶(円柱)」をモチーフにした5色のアイコンを採用。
- マルチスロット: Web①〜Web⑤の5つのスロットに、それぞれ異なるURLを割り当て可能。
- シームレスな体験: Chrome Custom Tabsを利用し、アプリを離脱せずに高速でWebページを開きます。
技術スタック
- Language: Kotlin 1.9+
- UI: Jetpack Compose (Material 3)
- Browser: androidx.browser (Chrome Custom Tabs)
- Persistence: Jetpack Preferences DataStore
- Shortcuts: ShortcutManagerCompat
実装のポイント:Androidの制約をどう回避するか
1. activity-alias による静的スロットの実現
Androidでは、実行時にActivityを動的に生成することはできません。そこで、AndroidManifest.xmlにあらかじめ5つの activity-alias を定義しておく手法を採用しました。
<!-- 例:AndroidManifest.xml での定義イメージ -->
<activity-alias
android:name=".Slot1"
android:targetActivity=".LauncherActivity"
android:icon="@drawable/ic_tea_blue"
android:label="Web①"
android:enabled="false"> <!-- 初期状態は無効 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
ユーザーが設定画面でスロットを有効にすると、PackageManagerのsetComponentEnabledSettingを介してエイリアスが有効化され、ドロワーにアイコンが出現します。
2. 透過Activityによるリダイレクト
各スロット(エイリアス)がタップされた際、共通の LauncherActivity が起動します。このActivityは Theme.Translucent.NoTitleBar を使用しており、画面自体は表示されません。
起動時に intent.component?.className を判定することで、「どのスロットから呼ばれたか」を識別し、DataStoreから対応するURLを取得してブラウザを起動します。これにより、ユーザーには「アイコンをタップしたら即座にブラウザが開いた」という体験を提供できます。
3. Chrome Custom Tabs の色連動
「アプリ感」を演出するため、Chrome Custom Tabsのツールバーの色を、選択したお茶缶アイコンの色と連動させています。
苦労した点と課題
-
ドロワー名の動的変更: Androidの標準ランチャーでは、
activity-aliasのラベルをプログラムから変更しても、ドロワー上の表示名が即座に反映されない、あるいは反映不可であるという制約がありました。- Nova Launcher等では変更可能ですが、AQUOS HOME等の標準ランチャーでは「Web①」のような固定名のままになる場合があります。
- 反映の遅延: エイリアスの有効化・無効化がシステム側に反映されるまで、数秒から数分のタイムラグが生じることがあります。
まとめ
Androidの基本的な仕組みである activity-alias を「スロット」として定義することで、動的なActivity生成ができない制約の中で、擬似的なマルチアプリ体験を実現しました。
ソースコードはGitHubで公開していますので、もし興味があればチェックしてみてください。
amekusa03/android-web-launcher