2

タスク: Android アプリケーション全体の可視性を追跡し、バックグラウンドまたはフォアグラウンドになったときにイベントを生成する必要があります。タスクの最初の部分が完了しました。Activity onStart()でインクリメントし、Activity onStop()でデクリメントする特別なグローバル カウンターがあります。このカウンターがゼロになると、アプリケーションはバックグラウンドになります。

タスクの 2 番目の部分はトリッカーです。onResume()の奇妙な動作とonWindowFocusChanged(boolean)を使用するためのアドバイスについて知っています。onWindowFocusChanged(boolean)のドキュメントを調べたところ、次のようなことに気付きました。

ただし、原則として、再開されたアクティビティにはウィンドウ フォーカスがあります...入力フォーカスを取得する他のダイアログまたはポップアップが表示されていない限り、他のウィンドウにフォーカスがある場合、アクティビティ自体にはフォーカスがありません。同様に、システムはシステム レベルのウィンドウ (ステータス バー通知パネルやシステム アラートなど) を表示する場合があります。これらのウィンドウは、フォアグラウンド アクティビティを一時停止することなく、ウィンドウ入力フォーカスを一時的に取得します。

チェックアウトする方法はありますか: アプリから再開されたアクティビティの上に表示されるウィンドウはどれですか? それは私のダイアログですか、それともキーガードですか?イベントをキャッチする方法はありますか:再開されたアクティビティに対する私のウィンドウを除くすべてが削除されますか?

4

1 に答える 1

0

あなたのカウンターベースのアプローチは明らかに間違っています。1 つの理由: onStop() の実行は保証されていません。

「背景」と「前景」の概念は、Android の概念と同じであると思います。しかし、あなたがこれまでに行ってきたことを読むと、Android とは「背景」と「前景」の意味が異なるようです。

そこから:

  • Android とは異なる背景と前景の意味を理解している場合は、自分に有利ではなく、おそらく誤った道をたどっているので、前景と背景の意味を調整することを再検討してください。
  • バックグラウンドとフォアグラウンドについて Android と同じ考えを持ったら、問題は、Android が既にイベントを生成しているのに、なぜイベントを生成しなければならないのかということです。イベントをサービスなどに送信する必要がある場合は、Activity ライフサイクル イベントをリッスンし、Service に対応するイベントを発生させることで簡単になります。

onWindowFocusChanged について: はい、もちろん、通知パネルでアプリを一時的に非表示にすることができます。あなたはまだAndroidデバイスを使用していますか? ここでの大きな問題は、通知パネルが表示されている場合、Android はアプリがバックグラウンドにあると見なすため、アプリをバックグラウンドにあると見なすかどうかです。

更新: Q のタイトルを読み直しました。残念ながら、可視性は多くのことを意味する可能性があるため、本当にやりたい/必要なことを述べていません。たとえば、アプリの上に半透明の通知パネルが配置されている場合、アプリは表示されていると見なしますか? しかし、肝心な点は変わりません。必要なものを Android が提供するものと一致させることが最も簡単です。;)

更新 2: アクティビティが自分のアクティビティのポップアップまたは自分自身によってバックグラウンドに移動されたかどうかを本当に知る必要がある場合は、この回答で必要な情報が得られます。

于 2013-02-12T08:13:32.243 に答える