0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Android] 好きなWebサイトを5つまで「アプリ化」して住み分けさせるランチャーアプリ「らん茶」を開発した話

0
Posted at

はじめに

特定の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>

ユーザーが設定画面でスロットを有効にすると、PackageManagersetComponentEnabledSettingを介してエイリアスが有効化され、ドロワーにアイコンが出現します。

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

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?