web-dev-qa-db-ja.com

Androidアプリを強制終了することと、最近のアプリリストでユーザーがアプリをスワイプすることを区別する

私はプロジェクトに取り組んでいます。特定のアクティビティに参加している間、ローカルのスティッキー通知を表示します。これは、アプリが最小化されている場合にも当てはまります。私が達成しなければならないことは、アプリが強制終了されるたびにローカル通知を削除することです(Androidによって、メモリ不足のため、またはユーザーによって、最近のアプリリストからスワイプして)。

通常、onDestroyは、Androidがアクティビティを使用してスペースを開くたびに呼び出されます。これは、1つのケースでは問題ありませんが、最近のアプリリストからアプリをスワイプしても問題ありません。 onDestroyを呼び出すと、スティッキー通知が残ります。

私がしたことは、アプリが強制終了されたときにonDestroyを強制する空のサービスを実装したことです(スワイプとシステム強制終了の両方)。これにより、通知を削除できます。

しかし、私がやりたいのは、スワイプとシステムキルを区別することです。

これも可能ですか?

11
Nikola

一般に、Androidがバックグラウンドに長時間存在しているため(またはリソースを再利用したいため)にアプリケーションを強制終了したい場合、AndroidアプリをホストしているOSプロセスを強制終了するだけです。しませんアクティビティまたはサービスコンポーネントでfinish()またはonDestroy()を呼び出します。「最近からスワイプ」の動作タスクリスト」は時間の経過とともに変化し、Androidバージョンによって異なります。誰かがそれについて本を書く必要があります:-(

13
David Wasser

アプリにサービスを追加し、onTaskRemovedメソッドを実装することで、ユーザーがアプリをスワイプして閉じるタイミングを確認できます。 https://stackoverflow.com/a/26882533/2441655 ==

3
Venryx

これは私が reddit で見つけたコメントで、私には本当に興味深いようです:

アプリをスワイプすると、ほとんどのアプリが効果的に「強制終了」されます。 SDKがインストールされている場合は、[〜#〜] adb [〜#〜]を使用してこれをテストできます。最近のリストからすべてをスワイプしてから、ブラウザを起動します。

ADBを使用してデバイスで「ps」を実行し、com.google.Android.browserプロセスが実行されていることを確認します。ホーム画面に移動しますが、まだ実行中です。他のいくつかのアプリを起動しても、com.google.Android.browserプロセスはまだそこにあります。

ただし、最近のリストからスワイプすると、プロセスは終了します。テストアプリを作成してさらに検証し、onDestroy()呼び出しをアクティビティに記録できます。アプリから戻ったりホームしたりしたとき、または他のアプリを起動したときに呼び出されません。ただし、最近のリストからアプリをスワイプすると呼び出されます。最近のアプリリストが実際には「マルチタスク」ではないことに同意します。

リスト内のアプリは必ずしも実行されているとは限りません。再度開こうとするずっと前に、メモリマネージャーによってプロセスが強制終了された可能性があります。ただし、スワイプによって実際のプロセスが終了したときに、他のアプリにすばやくジャンプすることが唯一の目的であると主張することはできません。

This は、最近のアプリリストからアプリをスワイプするとどうなるかについてのもう1つの良い答えです。しかし、私が最も気に入った部分は次のとおりです。

実際、最近のタスクのエントリを削除すると、そのプロセスに存在するバックグラウンドプロセスがすべて強制終了されます。サービスが直接停止することはありませんが、タスクが削除されたことを確認して、停止する必要があるかどうかを判断するためのAPIがあります。これは、電子メールアプリの最近のタスクを削除しても、電子メールのチェックが停止しないようにするためです。

本当にアプリを完全に停止したい場合は、最近のタスクを長押ししてアプリ情報に移動し、そこで強制停止を押すことができます。停止とは、アプリを完全に強制終了することです。すべてのプロセスが強制終了され、すべてのサービスが停止され、すべての通知が削除され、すべてのアラームが削除されます。明示的に要求されるまで、アプリを再度起動することはできません。

2
Jorge Casariego

アプリ内でスレッドがまだ実行されている場合にアプリを左にスワイプすると中断されますが、サービスは停止されません。便利なアプリを強制終了すると、スレッドとサービスが停止します。

0
Ehsan Jelodar

動作はアプリを閉じるのと似ていますが、まったく同じではありません。一般に(明示的な戻るボタンの処理を定義していないアプリの場合)、アプリケーション内から十分な回数、アプリを終了するのと同じです。 . このリンクの議論をチェックしてください それは主題に関していくつかの良いインプットを持っています

0
Mero

まず、1つのことを明確にしましょう:Android onDestroy()を呼び出さないでください。 アクティビティページ を参照して、Honeycomb以降、onPause()onStop()は、アプリが強制終了される前に呼び出されることが保証されています。

これらのセマンティクスは、HONEYCOMBで始まるプラットフォームを対象とするアプリケーションと、以前のプラットフォームを対象とするアプリケーションとの間でわずかに異なることに注意してください。 Honeycomb以降、アプリケーションはonStop()が返されるまで強制終了可能な状態にはなりません。これは、onSaveInstanceState(Bundle)が呼び出される可能性がある場合に影響します(onPause()の後に安全に呼び出される可能性があり、アプリケーションはonStop()が永続状態を保存するまで安全に待機できます。

したがって、(うまくいけば)Androidライフサイクルで空気を一掃した後、代わりにonStop()に通知削除コードを配置することで目的を達成できると思います。ユーザーが実際に特定のActvitiy(IEは強制終了されていない)に戻るため、元に戻す必要がある場合は、onRestart()に戻すことができます。

0
Steven_BDawg

最近のタスクリストからスワイプすると、最近のタスクからのみ削除されます.. Android5.0より前のonDestroyとも呼ばれていました。 APIレベル20を超えるデバイスで問題が発生している可能性があります。通常、システムの強制終了は、通常のAndroidアクティビティライフサイクルでは実行できません。バックプレスイベントのアクティビティを終了するだけです。

0
NilayDani