問題タブ [ondestroy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
7083 参照

android - アクティビティがクラッシュした後、Androidはバックグラウンドサービスを停止します

はじめに、下手な英語でお詫び申し上げます。

私の問題があります:

アクティビティが実行されているときにバックグラウンドで実行されるAndroidのサービスがあります。(このサービスは、指定された時間間隔でユーザー データをサーバーと同期します)。

そして、onCreateMethod のアクティビティから開始されます。このアクティビティは、Thread.UncaughtExceptionHandler を実装し、onCreate メソッドに登録して、アクティビティ内のすべての予期しない例外をキャッチします。アクティビティ内の何かで例外メソッド uncaughtException が呼び出され、サービスが stopService(serviceIntent); で停止する必要がある場合。しかし、サービス中の onDestoy は呼び出されません。しかし、アクティビティの onDestroy メソッドが呼び出されると (ユーザーがボタンを押して戻る)、サービスが正常に停止し、CService の onDestroy が呼び出されます。

アクティビティがクラッシュしたら、バックグラウンド サービスを停止する必要があります。Android がアクティビティを閉じて、スタック (ログイン画面) で前のアクティビティを開始すると、ユーザーがログに記録されなくなります。

提案をありがとう。

0 投票する
4 に答える
13520 参照

android - アクティビティのonDestroyメソッドにデータを保存します

私はタスクリストを作成していて、すべてのタスク(およびメタデータ)を保持するProjectオブジェクトを持っています。アクションログを使用しているので、タスクが変更されてもすぐにデータベースに保存するのではなく、アクティビティの終了時にデータベースにダンプするためにメモリに保持するだけです。これには、アクティビティのonDestroyメソッドが最適です。onRetainNonConfigurationInstanceメソッドが呼び出されなかった場合は、プロジェクトを保存するためのサービスを開始します(インスタンスはアプリケーションに保存されます)。保存には費用がかかります:DBプロジェクトにはリビジョンがあるので、新しいデータを保存し、現在のリビジョンを変更し、以前のリビジョンのデータを削除します。だから私は突然のアプリケーションの停止を恐れていません。

しかし、ドキュメントによると、私はしなければなりませんdo not count on this method being called as a place for saving data.

データを保存するための代替の場所はありますか?

0 投票する
2 に答える
4735 参照

android - サービスの onDestroy() メソッドが呼び出されない状況は?

サービスの onDestroy() メソッドが呼び出されない可能性があることは承知していますが、そのようなシナリオがいつ発生する可能性があるか教えてもらえますか? Service が強制終了される可能性があるかどうかに特に関心がありますが、その VM は引き続き実行されます。

サービスの onStartCommand() メソッドに ContentObservers を登録し、onDestroy() の登録を解除するサービスがあるため、質問します。VM 全体が (VM によって作成されたオブザーバーと共に) 強制終了されたためにサービスの onDestroy() メソッドが呼び出されなかった場合、それは問題ありません。しかし、サービスが onDestroy() を呼び出さずに「立ち去る」ことができるかどうか疑問に思っていますが、サービスが作成したオブザーバーは存続し、変更を受け取り続けます。

0 投票する
1 に答える
787 参照

android - OnDestroyを呼び出すときにメディアプレーヤーを解放すると、バックプレーヤーが押されたときに強制終了します

ユーザーをいくつかのビューに誘導した後、オーディオを再生するアプリがあります。オーディオの再生中に戻るボタンが押されたときを除いて、最初はすべて正常に機能しました。その時点でアプリは閉じましたが、オーディオは続行されました。調査した後、OnDestroyメソッドを導入し、オーディオ再生中に戻るボタンを押すと停止するメディアプレーヤーをリリースしました。

ただし、メディアプレーヤーが開始される前に、前のビューの1つで戻るボタンを押すと、強制終了メッセージが表示され、ログキャットに「アクティビティを破棄できません」と表示されます。リリースするメディアプレーヤーがないためだと思いますか?誰かが何が起こっているのか知っていますか?

メディアが再生されているときにのみsuper.OnDestroyに対してifステートメントを試しましたが、これは効果がありません。

0 投票する
0 に答える
433 参照

android - onbackpressed はアプリケーションを終了します

メニューボタンを押すとアクティビティ(ActivityBlah)を開始するメインメニュー(MainMenu.java)を持つアプリケーションがあります。

ActivityBlah.java は onDestroy を呼び出すのではなく、戻るボタンを押したときに onResume を呼び出す必要があり、このボタンもメイン メニューにつながる必要があります。

これを試しました:

この:

..そして、このウェブサイトでさらにいくつかの提案-それらのどれも機能しませんでした。

1) ActivityBlah がフォアグラウンドにあるときに戻るボタンを押すとすぐに、アプリケーションが閉じられ、電話のホーム画面が表示されます。この場合、MainMenu に確実に戻るにはどうすればよいですか?

2) 1) に成功したら、MainMenu.java の StartActivity が ActivityBlah を「作成」しないようにする方法

0 投票する
6 に答える
7117 参照

android - ホームボタンを押すとアクティビティが破壊される

私のアプリケーションでは、ホームボタンを押すと、アクティビティがonDestroy(). onPause()メソッドだけと呼ばれるはずですよね?

なぜそれが起こっているのですか?

0 投票する
2 に答える
4125 参照

android - onCreate でアクティビティを終了するときに、フラグメントの onCreateView が onCreate になる前にどのように呼び出されますか?

これは非常に奇妙です。ログインすると、アクティビティのフラグメントが表示されるシンプルなアプリがあります。アプリには非アクティブな「タイムアウト」もあり、その後アクティビティが終了し、ログイン画面が表示されます。タイムアウトが発生したときにアプリがバックグラウンドにある場合は、アクティビティで次のイベントonCreateまたはonStartイベントが発生したときに終了します。

ただし、ログインしたアクティビティに戻ると、フラグメントの onActivityCreated メソッドで NPE を取得することがあります。フラグメントは非常に単純で、String のメソッドを呼び出すだけです。文字列自体は、getArguments() の呼び出しによって取得されます。フラグメントが作成されるたびに、引数が常に設定されることを確認しました。

したがって、フラグメント内でonActivityCreatedが実際に前に呼び出されているように見えますが、これは不可能であることがわかっています。onCreate以下は、スタック トレースの一部です。

0 投票する
3 に答える
3613 参照

android - 構成変更時にサービスが停止しないようにするにはどうすればよいですか?

こんにちは、あなたの助けに感謝します。

私は次のような状況にあります。

私のアクティビティは、AsyncTaskを介してインターネットから大量のデータを取得するサービスにバインドされています。

サービスは重いので、ユーザーがアクティビティのために移動するときにサービスが停止していることを確認する必要があります。したがって、でサービスを停止するようにしonDestroy()ます。

構成の変更onDestroy()が呼び出されると、およびが呼び出されonPause()onStop()その後、サービスはによって停止されonDestroy()ます。

重要なのは、構成の変更時にサービスを停止させたくないということです。

どんな提案でも大歓迎です!

そして、あなたの助けに感謝します!

0 投票する
3 に答える
2399 参照

android - onDestroy ですべてのクリーンアップを行っても安全ですか?

より具体的に: タスクのキャンセルを onDestroy に配置しても安全ですか? また、受信者の登録を解除してリソースを解放するために onDestroy を使用しても安全ですか?

私の目的は、アクティビティが破棄される前ではなく、タスクがキャンセル/破棄されるようにすることです。

onDestroy():

  1. アクティビティが破棄され、リソースを解放する必要があるときに呼び出されます。
  2. アクティビティが急いで破棄された場合 (システムのリソースが不足している場合など) は呼び出されません。

最初のケースは明らかです。onDestroy ですべてのクリーニングを行い、問題は発生しません。ただし、2番目のケースは少し問題です。アクティビティが破棄され、onDestroy がスキップされると (タスクをキャンセルしないため)、タスクが実行を継続し、完了してデッド アクティビティを更新しようとするため、アプリがクラッシュする可能性がありますか?


本当の質問に来ます:

  1. アクティビティが強制終了され、onDestroy がスキップされると、そのアクティビティにアタッチされているものはすべて自動的に破棄されますか? (onDestroy は、すべてが完全に消去される場合にのみスキップされますか? タスク、登録済みの受信者など)
  2. onDestroy がスキップされた場合、これはアプリ全体が強制終了されたことを意味しますか?

ソリューションは onPause() または onStop() にはないため、onDestroy() に注目しましょう。引数:

  • onDestroy と同様に、Activity が破棄されているときに onStop() をスキップできます。
  • onPause の呼び出しが早すぎて頻繁に呼び出されるため、ユース ケースには適していません。例:

画面ロック: デバイスの画面がロックされているときに onPause を呼び出すことができます。多くの場合、これはスクリーンセーバーのように発生し、ユーザーはそこに立って画面を見ているため、すぐにロックを解除します。このような場合にタスクをキャンセルし、アプリが行っていることをすべて停止すると、ユーザー エクスペリエンスが低下するだけです。偶発的な「スクリーンセーバー」が原因で、アプリがチョークしたり誤動作したりしたくありません。

サンプルアプリには、アクティビティである 2 つの画面があります。ユーザーはそれらをすばやく切り替えることができます。このアプリでは、ユーザーは画面を頻繁かつ迅速に切り替える傾向があります。

ナビゲーション: 画面の 1 つに、システムから更新された位置情報を受け取る地図があります。場所 (ルート) の変更の正確なグラフィカル ログを記録するため、アクティビティが閉じられるまで常に実行する必要があります。通常、onResume と onPause で受信者を登録および登録解除します。ただし、ユーザーが移動するたびにマップの更新が停止するため、アプリが非常に使いにくくなります。そのため、onDestroy で受信者を登録解除したいと考えています。

Loading list : 2 番目の画面には、Web サービスからのデータを表示するリストがあります。データのダウンロードには 4 秒かかります。私は AsyncTask を使用しており、必要に応じてキャンセルする必要があることを知っています。ユーザーが画面を切り替えている間もロードを続行する必要があるため、onPause でキャンセルしないでください。したがって、onDestroy でキャンセルしたいと思います。

もっと多くの例があります。それらのいくつかは、すべての人の意見では完全に適切ではないかもしれません (AsyncTask の代わりにサービスを使用することを提案することさえあります)。しかし、アイデアは重要であり、それらのすべてが同じアイデアを持っています: アクティビティが一時停止している間、アクティビティに固有の作業を続けますが、アクティビティが破棄されたときにそれを停止するようにしてください. (AsyncTask を使用しているか、Service を使用しているかは問題ではありません。いずれの場合も、Activity が破棄された時点で作業を停止する必要があります。)

PS答えがonDestroy でクリーンアップを行うのは安全ではないということである場合、これは Android フレームワークが onPause で行っているすべてのことを停止する必要があることを意味します。そして、onDestroyを使用する理由がわかりません...

0 投票する
2 に答える
1057 参照

android - Android は、アプリがいつ更新されるかを検出します

Android アプリを開発していますが、ユーザーが市場を更新するときにデータを保存する必要があります。実はアップデート開始前。onDestroy() を使用してみましたが、アプリの更新時に呼び出されません。あなたはなにか考えはありますか?

問題は、アプリが定期的にデータを保存していることです。また、更新を選択すると、同時にファイルに保存しようとしてデータが破損することがあります...そのため、更新イベントを検出しようとしています。

ファイルは、スケジュールされたスレッドを使用して一定の間隔 (たとえば 60 秒) で保存されます。また、ファイルには、従来の writeObject() を使用してシリアル化されたオブジェクトを保存します。これは、60 秒の固定レートでのみ発生し、アクティビティの onPause またはサービスの onDestroy() でも発生します。

ただし、固定レートの保存が更新時に正確に発生した場合 (これによりアプリが破棄されます)、保存が不完全になり、オブジェクトが破損して、次回アプリが起動されたときに保存ファイルから無効なオブジェクトが取得されます。