126

アプリが実行されているときにホームボタンを押すと、アプリはバックグラウンドになります。ホームボタンを長押しして、最近のアプリリストからスワイプしてアプリを強制終了すると、プロセスが終了するのではなくonPause()onStop()または呼び出されるようなイベントは発生しません。onDestroy()サービスを停止し、通知を停止し、リスナーの登録を解除したい場合は、どうすればよいですか? かなりの数の記事やブログを読みましたが、有用な情報は得られず、それに関するドキュメントも見つかりませんでした。どんな助けでも大歓迎です。前もって感謝します。

4

10 に答える 10

176

同様の問題を解決しました。

最近のアプリリストからスワイプしてアプリケーションが強制終了されたときにサービスを停止するだけの場合にできることは次のとおりです。

マニフェスト ファイル内で、Service のフラグstopWithTaskを保持trueします。お気に入り:

<service
    android:name="com.myapp.MyService"
    android:stopWithTask="true" />

しかし、リスナーの登録を解除して通知などを停止したいと言ったように、次のアプローチをお勧めします。

  1. マニフェスト ファイル内で、Service のフラグstopWithTaskを保持falseします。お気に入り:

    <service
        android:name="com.myapp.MyService"
        android:stopWithTask="false" />
    
  2. MyServiceサービスで、メソッドをオーバーライドしますonTaskRemovedstopWithTask(これは が に設定されている場合にのみ発生しfalseます)。

    public void onTaskRemoved(Intent rootIntent) {
    
        //unregister listeners
        //do any other cleanup if required
    
        //stop service
        stopSelf();  
    }
    

コードの他の部分も含まれている詳細については、私の質問を参照してください。

お役に立てれば。

于 2014-11-12T08:38:15.963 に答える
20

同様の問題を解決しました。最近のタスクからスワイプした後、次回の起動時に適切に動作するようにするには、次の手順に従います。

1) プロセス ID を共有設定に保存します。

SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());

2) 最近のタスクをクリアした後、ランチャーからアプリケーションを起動する場合:

int previousProcessID = mSharedPreferencesUtils.getInt(SharedPreferencesUtils.APP_PROCESS_ID);

int currentProcessID = android.os.Process.myPid();

if ((previousProcessID == currentProcessID)) {
    // This ensures application not killed yet either by clearing recent or anyway
} else {
    // This ensures application killed either by clearing recent or by anyother means
}
于 2015-10-07T13:34:16.640 に答える
6

ホームを押すonPauseonStop、アクティビティが呼び出されているため、この時点ですべての節約とクリーンアップを行う必要があります。これは、Android プラットフォームがそれ以上のことを保証していないonDestroyか、他のライフサイクル メソッドが呼び出されるため、プロセスが強制終了される可能性があるためです。何の通知もなく。

于 2013-10-24T14:16:57.723 に答える
3

ViewModel.onCleared() は、ユーザーが「停止」またはボタンを押すのではなく、スワイプして予期しない終了を実行したときに、何らかのリソース (おそらくネットワーク上の別の場所で実行されているシステム) を解放することが目標である場合に役立ちます。[これが私が最初にこの質問にたどり着いた方法です]。

アプリケーションは通知を受け取らず、向きの変更などの構成変更のために Activity.onDestroy() が呼び出されるため、答えはありません。ただし、ViewModel.onCleared は、アプリケーションがスワイプされたとき (およびユーザーがアクティビティから戻ったとき) に呼び出されます。使用するリソースがスタック内の複数のアクティビティに関連付けられている場合は、参照カウントまたはその他のメカニズムを追加して、ViewModel.onClear がリソースを解放するかどうかを決定できます。

これは、ViewModel パターンを使用する多くの正当な理由のもう 1 つです。

于 2019-09-10T15:48:43.697 に答える