web-dev-qa-db-ja.com

活動が破壊されるのを可能な限り防ぐ

私はアプリを持っています。フラグメントが含まれている単一のアクティビティアプリです。

このアプリの通常の使用例は、起動して電話を片付け、時々電話に戻ってデータを挿入することです...これはロギングアプリであり、何かをして結果を挿入しますアプリに...

私には問題があります。時々、私のアクティビティが破壊され、空のバンドルで再作成されます...(ほとんどの場合、そうではありませんが、時々これが発生します...)。私のアプリは時々サービスを開始します、この場合このサービスでさえ殺されます...

これは、システムが私のアプリを強制終了したことを意味しますか?どうすればこれを回避できますか?

ユーザーデータと現在の上位フラグメントを保持する必要があります...そしてそれらはバンドルに保存され、状態とデータが保存される限りすべてが機能します...

ところで、私のアクティビティは常にTOP ACTIVITYであり、画面が頻繁にオフになるだけです...ユーザーが戻るボタンを押したままにするまでアクティビティをできるだけ長く存続させたい...または状態を保存する確実に

重要な注意

onSaveInstanceは常に機能するとは限りません(ライフサイクルの一部ではないため、呼び出される保証はありません)...ほとんどの場合のみ機能します...常に機能する方法が必要です...もしAndroidが私のアプリを殺す...

15
prom85

アプリをメモリに保存しないでください

Androidがアプリを強制終了するのをブロックしたくない。必要なのは、アプリの状態を適切に復元することです。そうすれば、ユーザーはアプリが破壊されたことに気付くことはなく、ユーザーは引き続き使用していないときに破壊されたアプリのメリット。

これが本当に必要な場合は、wakelockを使用してください。これはユーザーのバッテリーを消耗するので、これを実装する前によく考えます...情報 Androidデバイスがプログラムでスリープしないようにするにはどうすればよいですか?

onSaveInstanceStateの説明

これを行うには、バンドルに必要な情報を確認し、その情報をonSaveInstanceState(bundle:Bundle)メソッドで保持して、onCreate(sameBundle:Bundle)で再利用できるようにします。

詳細については、 アクティビティ状態を保存 および アクティビティ状態を復元 のGoogleドキュメントから入手できます。

約Androidアクティビティのライフサイクル

以下のコメントで@ prom85が述べているように、onSaveInstanceStateメソッドはライフサイクルの一部ではないため、呼び出される保証はありません。この回避策は、onPauseライフサイクルフックを使用してデータが確実に保存されるようにすることです。

詳細については Android:onSaveInstanceStateがアクティビティから呼び出されていません

9
hcpl

私も同様の問題を抱えていました。解決策を探しているときにこの投稿にたどり着きました。これを達成するにはマニフェストを試してみて、Androidエコシステム、

Androidアクティビティは、事前に定義された作業があるタスクです。

ドキュメントをよく調べましたが、アクティビティは2つの方法で構成できることがわかりました。

  1. 持続的
  2. 非永続

マニフェストのアクティビティについて次のように言及した場合

Android:persistent="true"

以下のユースケースを実行します

  1. APPを起動します
  2. 戻るまたはホームボタンを押す
  3. バックスタックでアクティビティを再度選択して、前面に移動します

アクティビティは開始->一時停止->停止->再開に入り、onDestroyメソッドには入りません。

言及しない場合

Android:persistent="true"

同じユースケースの場合

アクティビティは開始->一時停止->停止->破棄に入り、バックスタックからアクティビティを選択した場合

アクティビティが再開->作成->開始に入る

アプリがバックスタックにあるときに実行を継続するアクティビティ開始時にサービス/タスクを実行する場合は、onCreateメソッドで開始し、マニフェストでアクティビティを永続として指定してonDestroyを強制終了する必要があります。

私の上記の解決策が同じ問題のためにここに到着する他の人を助けるかもしれないことを願っています