問題タブ [activity-lifecycle]

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 投票する
4 に答える
1128 参照

android - onStop()でリソースの割り当てを解除しても安全ですか?

こんにちは、みんな!

Activity目に見えるレイアウトを表示しながら、かなり多くのメモリを割り当てるがあります。ActivityUIはこのメモリに大きく依存しますが、ユーザーが(通常は別のユーザーActivityをフォーカスに合わせて)離れた後も、これらの割り当てを保持する必要はありません。

Activityメモリの割り当てを開始しonResume()、すべて問題ありません。しかし、私を少し混乱させるのは割り当て解除です。今のところonPause()、対応するUI要素も破棄するすべてのメモリを解放します。Activity実行中はまだ表示されているためonPause()、ユーザーは実際のUI要素が破棄されるのを確認できます。これは醜く、私が望むものではありません。

だから私の質問:

  1. onStop()(ドキュメントによると、が呼び出されActivityたときに表示されない)でメモリを解放(UIを破棄)しても安全ですか?onStop()
  2. onStop()信頼できますか?
  3. onStop()が呼び出されるたびに呼び出されることが保証されていますonPause()か?


編集:
私は私を混乱させるものをもう少し明確に説明しなければならないと感じています。developer.android.comによると:

...強制終了可能としてマークされたメソッドの場合、そのメソッドが戻った後、アクティビティをホストしているプロセスは、コードの別の行が実行されることなく、いつでもシステムによって強制終了される可能性があります。

onStop()メソッドは「強制終了可能」としてマークされています。

  • 上記は(特に " after that method returns"の部分)のスコープ全体onStop()が実行されることが保証されていることを意味しますが、それが返されると、ランタイム(たとえば、で開始された生成されたスレッドonStop())は保証されませんか?

  • それともonStop()、スコープの終わりに達する前に(killed at any timeパートの時点で)中断される可能性があることを意味しますか?

  • それとも、私が-私の神の愚かさの中で-見ない何か他のものを意味するのでしょうか。

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

android - 画面が暗くなると onRestoreInstanceState が一貫しないのはなぜですか

状態データをアクティビティの onSaveInstanceState 関数に保存し、そのデータを onRestoreInstanceState に復元します。このコードは 95% の確率で問題なく動作します。

Android がテストごとに異なる結果を生成する原因となるテスト ケースを見つけましたが、その理由がわかりません。私はオリジナルの Droid フォンを持っていて、キーボードがスライド式になっています。私のアプリでは、onRestoreInstanceState が呼び出されないためにデータが復元されない状況を再現できる 2 つのテスト ケースを実行します。テストはほぼ同じですが、わずかに異なる結果が得られたため、明らかに少し異なるものがあります.

テスト ケース 1 (縦向きモードの電話、キーボード入力):

テスト ケース 2 (横向きモードの電話、キーボードが表示されていない):

テスト ケース 1 では、約 60% の確率でデータが復元されません。テスト ケース 2 では、約 20% の確率でデータの復元に失敗します。私が本当に際立っている唯一の違いは、キーボードを押し込んだり引き出したりした後に画面が点灯することです. その画面が点灯すると、ほぼ毎回データが失われます。

画面を暗くしてから、電話のロックを解除してアプリに戻る前に、キーボードを約 10 回連続して出し入れすると、ほぼ100% の確率でこの問題が再現されます。

データが正常に復元された場合の呼び出しシーケンスは次のとおりです。

データが正常に復元されなかったすべてのケースで、呼び出しシーケンスは次のとおりでした。

誰かがここで何が起こっているのか教えてもらえますか? 同じ正確なテストを実行しても、異なる結果が得られるのはなぜですか? テスト ケース #1 (または #2) を何度も実行すると、結果が同じになることはありません。なぜこれが起こっているのかを理解したいのですが、もっと重要なのは(決定的な答えが不可能な場合)、データを毎回保存したいだけなので、どうすればよいですか?onRestoreInstanceState にあるコードを onCreate に移動すると問題が解決すると思っていましたが、テスト ケースを数回実行したところ、onCreate に渡された Bundle が null である場合があり、データが復元されないことがわかりました。

onCreate の Bundle を当てにできず、onRestoreInstanceState が呼び出されるのを当てにできない場合、何が残るでしょうか? 私の唯一のオプションは onResume ですか? このアクティビティは、大量のデータを維持します。onRetainNonConfigurationInstance と getLastNonConfigurationInstance を使用して、onResume で getLastNonConfigurationInstance を呼び出すことを検討する必要がありますか? 以前はこれらの機能を使用していましたが、データ損失が発生したため使用をやめました。当時は理由がわかりませんでしたが、まさにこの問題が原因だったのではないかと思います。しかし、以前に使用したときは、onCreate で getLastNonConfigurationInstance を呼び出しました。onResume から呼び出された場合、おそらく異なる/より良いでしょうか?

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

android - Android アプリがいつバックグラウンドになるかを検出する

私のアプリケーションでは、アプリケーションがバックグラウンドになるか、同じアプリケーションの別のアクティビティに切り替わるかを検出する必要があります... onPause メソッドを使用する必要があることはわかっています...しかし、2 つのケースをどのように区別できますか?

0 投票する
5 に答える
734 参照

android - コードのどこに配置するか、onCreate()/OnStartを理解するのに助けが必要です

アクティビティのライフサイクルを調べてみましたが、コードをどこに配置すればよいかわかりません。

  1. 私のonCreate()中で私はGPS位置を取得します。
  2. アプリケーションの後半で、Camera Intentが呼び出され、その後閉じられます。
  3. GPS位置情報が再度取得されます(もう一度実行されていると思いonCreate()ますか?)

GPS位置情報を取得したいのは、アプリケーションの開始時に一度だけ取得することです。

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

android - アクティビティのライフサイクルで「可視性」とは何を指しますか? onPause 対 onStop?

アクティビティのライフサイクルが頭を悩ませています。http://developer.android.com/reference/android/app/Activity.htmlのドキュメントは、可視性の概念を説明するときに非常にあいまいであるため、いつonStop()vs が呼び出されるのかわかりませんonPause()

ドキュメントの次の 2 つのステートメントを比較してください。

(ライフサイクル図の真下から取得)

onStart()およびメソッドはonStop()、アクティビティがユーザーに対して表示および非表示になるときに、複数回呼び出すことができます。

(「killable」列のある青いテーブルのさらに下)

onPause()システムが以前のアクティビティの再開を開始しようとしているときに呼び出されます。

最初の引用から私が理解できるのは、それが「非表示」のときonStop()にアクティビティで呼び出されるということです。「非表示」とは、別のアクティビティが再開され、アクティビティが完全にカバーされていることを指していると思います。しかし、2 番目の引用では、別のアクティビティが再開しようとしているときに呼び出されると述べています。アクティビティ A も完全に非表示になるのではないでしょうか。どちらの場合も、その活動が「隠された」ものになることを暗示しているようですよね? 私のおそらく誤った解釈によると、とは同じ状況で呼び出されます。AABAonPause()AonPause()onStop()

onStop()ドキュメントは、非表示 (呼び出される) と部分的な可視性 (呼び出される)の間でも異なるようonPause()です。しかし、アクティビティがまだ部分的に表示されているのはいつですか? 文字通りの意味ですか?または、画面全体をカバーする新しいアクティビティ (アクティビティが startActivityForResult を呼び出し、日付ピッカー アクティビティを開始する) を開始したときに、アクティビティが「部分的に表示されている」と見なすことはできますか? 確かに、アクティビティは onStop 呼び出されませんか? いつでも結果を受け取るはずです。

だから私は私が得ていないものを理解しようとしています。onPause の呼び出しが保証されていることを理解しています。これは、アクティビティAがフォーカスを失ったとき (デバイスがスリープ モードに入る、スクリーンロックなど)、別のアクティビティBがフォアグラウンドを取得するときです (アクティビティが activityBによって開始された場合と開始されていない場合がありますA)。しかし、どの時点onStop()でアクティビティが呼び出されるのAでしょうか?

アクティビティ スタックのアクティビティ A の上に積み上げられたアクティビティの数の問題ですか? 「可視性」には 2 つの異なる定義がありますか?

テキストの壁については申し訳ありませんが、私は本当にイライラしています:S

では、問題は次のとおりです。具体的には、どのような状況で活動が「隠されている」と見なされ、その活動onStop()が呼び出されるのでしょうか?

編集:

各 onX メソッドに Toast 通知を挿入したところ、さらに奇妙な点が見つかりました。

  1. ホームボタンを押すと、常にonStop() が呼び出されます。しかし、アプリケーションを起動しても は呼び出されませんonRestart()。代わりに を呼び出しますonCreate()。これは私には奇妙に思えますが、わかりました...
  2. メイン アクティビティの上に「USB マス ストレージ」アクティビティが開始されると、onStop()が呼び出されます。また、USB ストレージ アクティビティを終了してメイン アクティビティに戻るonRestart()と、 の代わりに が呼び出されonCreate()ます。
  3. デバイスがスリープ モードに入り、ウェイクアップすると、アクティビティはonPause()andonResume()サイクルのみを通過します。

最後のポイントは予想通りでした (ただし、ライフサイクル図には収まりません)。しかし、1. と 2. はどうでしょうか。

onRestart()最初のポイントでは、アクティビティを再開するときにへの呼び出しを期待していました。アクティビティの割り当てを解除してonCreate()代わりに呼び出すのはなぜですか?

ポイント 2 を見てください: ドキュメントによると、「別のアクティビティがアクティビティの前に来るとき」をonPaused()呼び出す必要があります。USB ストレージのアクティビティが発生したときに起こったことではありませんか? を呼び出さず、 -サイクルonPause()を通過しました! 明らかに、ドキュメントは「別のアクティビティがアクティビティの前に来る」場合を考慮していません。それで、実際に何が起こったのですか?onStop()OnRestart()

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

android - 複数のアクティビティを使用している場合、アクティビティがフォアグラウンドになった後に保持されたデータを処理する方法は?

現時点では、Android のライフサイクル管理について少し混乱しています。アクティビティがフォアグラウンドに戻った後、保持されたデータを再開するには、少なくとも 4 つの可能性があります。

  • Android の処理:十分なメモリがある場合、アクティビティの再起動後、Android は重要なデータ (チェックされたラジオ ボタン、EditText のテキストなど) を保存して再開します。ユーザーは、アクティビティが開始されたときと同じ状態になります。バックグラウンド。

  • onPause、onResume: onPause をオーバーライドし、重要なデータをデータベースまたはテキスト ファイルに保存し、次回の onResume 実行時に再開します。

  • onSavedInstance(Bundle)、onRestoreInstance(Bundle):データをキーと値のペアとしてバンドルに保存し、onRestoreInstance の実行後にそれらを復元できます。

  • onRetainNonConfigurationInstance()、getLastNonConfigurationInstance():ストレージの問題をすべて 1 つの大きなオブジェクトで処理し、onCreate の実行時に getLastNonConfigurationInstance() を読み取ります。

どのアプローチが最適かは混乱しますが、いつどの可能性を使用するかを知るには、開発経験に依存していると思います。それぞれの良い例があればうれしいですが、これは私の質問ではありません。さまざまなアクティビティがあり、バックグラウンドで一時停止すると Android によって 1 つのアクティビティが強制終了される場合、これらすべてにどのように対処すればよいのでしょうか。

私の場合、MainActivity と MessageActivity があります。MessageActivity は、2 つの状態で構成される ViewSwitcher で構成されます。状態 1 は、ラジオ ボタンの選択リストです。状態 2 は、2 つのボタン (送信と中止) を持つ EditText です。各状態をモンキーテストし、Android のホームボタンを押してアプリケーションを再起動すると、適切な状態の適切なアクティビティと古いデータがフォアグラウンドになり、処理を Android に任せます。それでうまくいきます。
しかし、Android がバックグラウンドで MessageActivity を破棄するとどうなるか: Android の方法を使用すると、データが失われ、次にアプリケーションを再起動した後に (MessageActivity->state(1 または 2) ではなく) MainActivity が開始されると思います (それは正しいですか?)。したがって、MessageActivity のデータを保持したい場合は、他の 3 つの可能性のいずれかを使用する必要があります。
アプリケーションのエントリ ポイント (つまり MainActivity) が最後のアクティブなアクティビティと異なる場合に、これを適切に行う方法。問題は、ViewSwitcher の特別な状態で特別なアクティビティを再開する必要があることです。onStart() または onResume() メソッドで startActivity(Intent) を使用して MainActivity から MessageActivity を開始できますが (MainActivity がおそらくエントリ ポイントであるため)、ライフサイクル管理で多くの論理的な問題が発生します。この事実のため、これが正しい方法だとは思いません。

しかし、それを行うための正しくて最良の方法は何ですか?

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

android - Androidでレイアウトが破棄されたときにオーバーライドするメソッド

LinearLayout を拡張するカスタム コンポーネントがあります。Layout が破棄または削除されたときに特定のステートメントを実行する必要があります。(または削除されようとしています)

1 つの方法は、アクティビティの onPause() または onDestroy() を確認し、カスタム コンポーネントのメソッドを呼び出すことです。しかし、私はそのオーバーヘッドをアクティビティから取り除きたいと思っています。レイアウトが切り離されたときにカスタムコンポーネント自体が処理できるようにします。しかし、レイアウトが削除されたときに(イベントを検出するために)オーバーライドする適切な方法が見つかりません。これを処理する方法はありますか、またはアクティビティの onPause() および onResume() メソッドを使用する必要がありますか?

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

android - ビューでスリープが開始されたがホーム画面からではないのに、AndroidアプリがonCreate()を呼び出すのはなぜですか?

私のアプリは、1つのことを理解していないことを除いて、完全に動作しているようです。ホームボタンを押してアプリに戻ると、以前の状態に(自動的に)復元されます。ホームボタンを押してから、電話がホーム画面(または自分以外のビュー)でスリープ状態になり、アプリに戻ると、以前の状態が(自動的に)復元されます。

さて、キッカーは、電話が私のアクティビティを上にしてスリープ状態になると、以前の状態を自動的に復元しませんが、初期化の開始が発生し、アプリがちょうど開始したかのように動作するため、onCreate()を呼び出しているようです。

インスタンスを保存し、saveInstanceState()を使用して保存された状態を呼び出すことができるので、最終的に問題は解決できますが、私の質問は、Androidが自分のアクティビティからスリープしたが別のアクティビティからスリープしなかった場合にonCreate()を呼び出すのはなぜですか?そして、onCreate()を呼び出さない場合、何が起こっているのか、そしてなぜsaveInstanceState()を気にする必要があるのですか?電話がスリープ状態になるときを除いて、すべてのインスタンスで(メモリ不足を除いて)私のアプリはユーザーを最後の「目印」に戻します私の活動から。

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

android - Android でのランチャー + singleTask アクティビティ

プロジェクトでのアクティビティの起動に問題があります。

私の「ホーム」アクティビティ (H) では、その中でいくつかのサービスを選択できます。S11->...-> S1n がサービス (S1) のアクティビティ フローであるとします。H は、アプリの LAUNCHER アクティビティです。

また、Hから別のアプリに切り替えて戻る必要があります。そのアプリの動作を変更することはできないため、H アクティビティを「singleTask」として宣言して、アクティビティ スタックに複数のインスタンスが含まれないようにする必要があります。

問題は、H の後にプッシュされたアクティビティを切り取らずにアプリを再起動できないことです。たとえば、H-S11-S12 がある場合、HOME を押して最近のアプリ メニューから再起動すると、H がフォアグラウンド アクティビティとして取得されます。

何か案は?この組み合わせを機能させる方法はありますか?ありがとう!

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

android - Android のカメラ プレビューは、スマートフォンの 3 つの向きのうち 2 つの向きでのみ機能します

私の Android アプリでは、Camera クラスを使用して、電話のカムレアからスナップショットを取得しています。startPreview を使用してカメラのプレビューを開始し、次に takePicture を使用して画像を取得します。追加して、アプリにランドスケープを強制しています

AndroidManifest.xml へ。問題は、電話を反時計回りに 90 度回転させたときにアプリに戻ったときです。この場合、プレビューが表示されません。黒であるか、ビューに設定されていません。GUI が表示され、電話から適切に写真を取得できます。プレビューが表示されないことを除いて、すべてが機能します。これは、電話機が縦向きの場合、または電話機が時計回りに 90 度回転している場合には発生しません。

つまり、左に回転するとプレビューは黒くなりますが、他の方向に回転するとプレビューは問題ありません。

私はかなり長い間これについて頭を悩ませてきましたが、アプリに戻る前に、最終的にそれが電話の向きに関連していることを発見しました.

特定のオリネテーションでプレビューが表示されないのはなぜですか?

編集:私は何かを発見しました。それ自体はカメラのせいではありません。カメラ プレビューの上に配置した GUI surfaceView は、どういうわけかプレビューを非表示にします。背景を透明にするように設定しましたが、機能しません。onDraw のすべての描画呼び出しも削除しました。しかし、それでも黒く描画されます。何らかの理由で、他の向きでは発生しません。何か案が?