質問: ### 前提・実現したいこと Unity 製 Android アプリで、`UnityPlayerNativeActivity` を拡張した `FooActivity` (仮称、以下同様) があります。 `FooActivity` は起動モードが `singleTask` になっています。 これに `ACTION_MAIN`x`CATEGORY_LAUNCHER` や `ACTION_MAIN`x`CATEGORY_INFO` の intent が送られた時、そのタスクのスタックを保持したまま前面に出ることは可能でしょうか? ### 発生している問題・エラーメッセージ 上述のインテントが `FooActivity` に投げられると、上位のアクティビティが破棄されてしまいます。 起動モードを `standard` にすれば直るという噂を聞いたのですが、諸事情あって `FooActivity` を `singleTask` 以外にすることはできません。 ### 試したこと 問題のインテントを別のアクティビティで代わりに受け取り、フラグを操作してから明示的&暗黙的インテントで `FooActivity` に投げてみました。 以下のフラグ操作を試しましたが、うまくいきませんでした。 * `NEW_TASK` 下ろす * `CLEAR_TASK` 下ろす * `CLEAR_TOP` 下ろす * `SINGLE_TOP` 下ろす * 全部下ろす * `BROUGHT_TO_FRONT` 上げる * `FORWARD_RESULT` 上げる ### 補足情報(言語/FW/ツール等のバージョンなど) Unity 5.3.4p4 Android の API level (minSdkVersion) は 16 です。 `FooActivity` から起動されるアクティビティは、プラグインによるものです。
回答: 自己解決いたしました。 `FooActivity` に代わって `ACTION_MAIN`x`CATEGORY_LAUNCHER`, `ACTION_MAIN`x`CATEGORY_INFO` のインテントを受け取るアクティビティ (以下 `LauncherProxyActivity`) で、以下のような処理を行ったところうまくいきました。 1. Android 5 Lollipop 以前では `android.app.ActivityManager#getRunningTasks(int)`、 6 Marshmallow 以降では `android.app.ActivityManager#getAppTasks()` でタスクを列挙する。 2. それらの中から `FooActivity` で始まっているタスクを探す。 (各タスク情報の `baseActivity` が `FooActivity` かどうかで判定) 3. タスクが見つかった ⇒ `moveTaskToFront(int, int)` で前面に出す。それができない (Android 3 ICS 未満 ∨ `REORDER_TASKS` パーミッションがない) 場合はタスクの `topActivity` に空のインテントを送る。 タスクが見つからなかった ⇒ `LauncherProxyActivity` に届いたインテントの複製に以下のフラグ操作を行い `FooActivity` に投げる。 * `Intent.FLAG_ACTIVITY_NEW_TASK` 下ろす * `Intent.FLAG_ACTIVITY_CLEAR_TOP` 下ろす * `Intent.FLAG_ACTIVITY_FORWARD_RESULT` 上げる 他アプリのも含めたタスク探索は個人的にナンセンスな気がしますが、一応これで期待通りの挙動にできました。