alwaysRetainTaskState と lauchMode を使用して Android アプリの状態を保持する
-
20-09-2019 - |
質問
私の Android アプリには、アプリケーションへのエントリ ポイントとして機能するメイン アクティビティがあり、マニフェスト ファイルで次のように構成されています。
<activity android:name=".Main"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:alwaysRetainTaskState="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
したがって、特定の使用例として、ユーザーがアプリケーション ランチャー内のアイコンをクリックしてホーム画面からアプリを起動するとします。アプリを起動した後、ユーザーはメイン アクティビティからアクティビティ A に移動し、最後にアクティビティ B に移動します。この時点で、ユーザーは Facebook をチェックすることに決めたので、ホーム ボタンをクリックしてアプリをバックグラウンドに置き、Facebook アプリを起動します。
Facebook をチェックした後、ユーザーは私のアプリに戻りたいので、ホーム キーを押し、アプリケーション ランチャーからアプリケーションを起動します (最初に起動したときと同じように)。
ユーザーがアプリに戻ったときに、アプリがバックグラウンドに置かれたときにユーザーがいた最後のアクティビティ (この場合はアクティビティ B) にアプリが戻るようにしたいと考えています。マニフェスト ファイルで、alwaysRetainTaskState=true を設定して、OS がアプリのアクティビティを強制終了しないようにしました。
さて、私の質問です。上で説明した動作を実現するにはどうすればよいでしょうか?アプリのアイコンをクリックすると、何があっても常に Main アクティビティから開始されます。これは category.LAUNCHER 属性のせいだと思います。android:launchMode=singleTask を試しましたが、違いはありませんでした。常に Main から始まります。
誰かがインテント フィルター、起動モード、タスクを明確にしてくれれば、それは素晴らしいことです。
解決
私はスクリーンレスDispatcherActivity
を追加し、(非常に同じインテントフィルタを使用して)それをデフォルトの1にすることによって、これを解決しました。そのonCreate
の方法であなたには、いくつかの合理的なデフォルトに基づいて意思(例えば、あなたの主な活動)ORを作成して呼び出すの活動が開始されなければならないかを識別するいくつかの保存されたトークンに基づいて。そのトークンを使用すると、再起動時に呼び出したいすべての活動のonStop
方法で更新/保存されます。あなたは、環境設定にこのトークンを保存することができます。
ここで合理的であるという方法をonStop実行します見えた最後の活動時に中断されます。
ここで注意の言葉:私はこのパターンを実装しましたし、それがうまく合理的に働きました。しかし、歴史をあまりにもよく再生されないようだし、最終的に私はあきらめて、このコードをヤンク。誰もがこれまで訴えていない。
他のヒント
FYI singleTask
は、あなたが望むものではありません
http://developer.android.com/guide/トピック/マニフェスト/活動element.html#LMODEする
どのように活動Bを起動していますか?任意の非標準起動モードやテントのフラグ?
同じような問題を抱えてここに来ている人のために、私はあなたが見ているものと同じような奇妙なものを見つけました...多分。
アクティビティ A -> B -> C などのアプリがあるとします。アプリがアプリリスト、別名ランチャーから起動された場合、アプリが常に A に「再開」するという問題が発生していました。ただし、「再送信」画面 (ホームを長押し) から再開すると、正しい再開動作が表示されます (予想どおり B または C に再開します)。私のマニフェストは特別なものではなく、ルートアクティビティにalwaysRetainTaskState="true"を設定しており、起動モードはデフォルト(標準)です。
ウェブサイト経由で APK を携帯電話にロードしていました. 。ダウンロードしてインストールした後、 「開く」を押します すぐにアプリを起動します。何らかの理由で(アプリをアンインストールした後)再度ダウンロードしてインストールするのに疲れましたが、その後、 代わりに「完了」ボタンを押しました. 。次に、ランチャー/「すべてのアプリ」リストからアプリを起動すると、最近のものから再開するのと同じ再開動作が行われます。つまり、「完了」ではなく「開く」をクリックしたときのインストールプロセスが原因で問題が発生していました。
この「ソリューション」を API10 (2.3.5) と API15 (4.0.4) で検証しました。