web-dev-qa-db-ja.com

Android:最近のアプリボタンからアプリを閉じるときにOnDestroyが呼び出されない

このボタンを押すと

このように閉じなかったアプリが表示されます

ただし、この画面(画像の下)からアプリを閉じる場合、onDestroy()メソッドは呼び出されませんが、アプリは閉じられます。この方法でアプリを閉じたときにonDestroy()を呼び出す必要があります。これどうやってするの? -

18
Curio

Androidドキュメントで指定されているように、アプリケーションを終了するときにonDestroy()が呼び出されることは保証されません。

「このメソッドを呼び出さずに、システムが単にアクティビティのホスティングプロセスを強制終了する状況があります」

https://developer.Android.com/reference/Android/app/Activity.html#onDestroy%28%29

代わりに、アクティビティを実行しているタスクが破壊されたときに通知されるサービスを作成できます。

サービスクラスを作成します:

_public class ClosingService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);

        // Handle application closing
        fireClosingNotification();

        // Destroy the service
        stopSelf();
    }
}
_

マニフェストでサービスを宣言/登録します(アプリケーションタグ内、ただしアクティビティタグ外):

_<service Android:name=".services.ClosingService"
             Android:stopWithTask="false"/>
_

_stopWithTask="false"_を指定すると、タスクがプロセスから削除されたときに、サービスでonTaskRemoved()メソッドがトリガーされます。

ここで、stopSelf()を呼び出してサービスを破棄する前に、アプリケーションの終了ロジックを実行できます。

25
Charlie

アクティビティのライフサイクルに関する情報を読む必要があります。 onDestroyメソッドには1つのことがあります。常に呼び出されるわけではありません。あなたはそれに頼ってはいけません。

何を達成しようとしているのかを指定してください。より良い解決策を提供しようと思います。

提案

ですから、私があなたを正しく理解していれば、一つのことを提案できます。 N秒ごとにServiceを起動するLocalBroadcastを開始します(システムにそれほど負荷はかかりません)。 BroadcastReceiverにこのブロードキャストのActivitiesを登録してください。このようにして、trueをキャッチできるfalseがあるかどうかに応じて、BroadcastReceiverまたはLocalBroadcastを取得します。そして、SharedPreferencesが押されたかどうかを示す何らかのButton値をチェックするレシーバーがない場合。

1
Ekalips