世の中には技術的な情報を集める手段がたくさんあります。
先週の弊社CTOの記事にもありますが、インターネットを利用すれば大抵の問題は解決できますし、勉強会に参加することでも解決できるかもしれません。
ただし、そこには情報を提供する人間が語らない情報はありません。
つまり得られる情報はどうしても偏ってしまいます。
今回は、
- 情報を提供する人が知っていて当然と思っている情報
- そもそも知っている人が少なくて提供されない情報
なのかなぁ?と感じたAndroidのホームアプリの作り方をまとめます。
ホームアプリを作ったことはありますか?
皆さんはホームアプリを作ったことはありますか?
個人的なイメージでは仕事でも趣味でもあまり作らない種類のアプリではないかと思います。
単純にホームアプリを作ろうと思って検索をかけると多くの情報が出て来るので、きっとこの段階で困る人は少ないでしょう。
ホームアプリのAndroidManifest.xmlのルートアクティビティに下記のintent-filterを記述するだけでOKです。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
ホームアプリ表示中にホームボタンを押すと...
さて、ホームアプリに画面遷移が1つもない場合はこれで問題ないのですが、画面遷移が入って来ると問題が発生します。
ホームボタンを押してもホームアプリの初期画面に戻りません。
ホームボタンのイベントを直接ハンドリングすることはできませんし、onUserLeaveHint等のライフサイクルメソッドも呼ばれません。
しかもSDK付属のサンプルアプリでも発生しているため参考にならず、市販されている端末のホームアプリでは初期画面が表示されるため仕様ですとは言えません。
困ったときは
「やはり公式のドキュメントが一番!」と言いたいところですが、読みこんでいってもそれらしい情報が見当たりません。
最終的に行き着いたのはAOSPのLauncher3のソースコードでした。
今回は設定周りだと思ったのでAndroidManifest.xmlのルートアクティビティに対する記述を見てみます。
<activity
android:name="Home"
android:theme="@style/Theme"
android:launchMode="singleInstance"
android:stateNotNeeded="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.android.launcher3.Launcher"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:windowSoftInputMode="adjustPan|stateUnchanged"
android:screenOrientation="nosensor"
android:configChanges="keyboard|keyboardHidden|navigation"
android:resizeableActivity="true"
android:resumeWhilePausing="true"
android:taskAffinity=""
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY" />
</intent-filter>
</activity>
全然違いますね。
この差分から解決に必要な設定を探しました。
そして解決へ
結論としてはclearTaskOnLaunchをtrueにすることで解決しました。
ドキュメントの説明を読んでもこの設定によってホームボタンが効くようになる印象は受けないので少しモヤモヤするところですが、Googleのランチャーアプリを参考にしているので問題ないでしょう。
心配な方はルートアクティビティの設定をそのまま利用すると安心かもしれません。
まとめ
問)自作ホームアプリでホームボタンを押下してもうんともすんとも言わない問題を解決せよ。
答)AndroidManifest.xmlのルートアクティビティの設定にandroid:clearTaskOnLaunch="true"を追加する。