10

アプリケーションがバックグラウンドに移行してフォアグラウンドに到達したときに、アプリケーションレベルでコールバックが発生しない理由は何でしょうか。ActivityクラスのonPauseonResumeは、現在の上位のアクティビティでのみ呼び出されます。アプリケーションレベルのスコープを持つバックグラウンドタスクを停止したい場合、アプリがバックグラウンドに移行したときにそれを停止する簡単な方法はありません。これらのイベントコールバックに対する需要は高いです。

Androidにアプリケーションの一時停止と再開時にアプリレベルのコールバックがないのはなぜですか?アプリレベルではない場合、タスク(アクティビティスタック)レベルでAndroidに実装できますか?

本当の問題:

バックグラウンドのTimertaskは、定期的にWebからのデータでUIを更新します。アプリがフォアグラウンドでなくなったら、停止したいと思います。

現在、繰り返しコードをに入れていBaseActivityます。これはアクティビティレベルです。タスクは、すべてのアクティビティの一時停止と再開のたびに停止および開始します。アプリがbgに移行するイベント、またはfgに到達するイベントは、これらのイベントの1つに隠されていますが、私にはわかりません。それを行うためのより良い方法があるかどうかを知りたかったのです。つまり、アプリがユーザーに表示されなくなったときを知ることです。

4

3 に答える 3

4

TimerTask の代わりに Handler を使用します。アクティビティがアクティブでない場合、アクティビティのルーパーにバインドされたハンドラーの時限メッセージはトリガーされません。

パターンは、時間指定されたメッセージをハンドラーに送信することです。ハンドラーは、バックグラウンドでリクエストを実行し、UI を更新する Thread/AsyncTask を生成します。スレッドの作成/破棄のオーバーヘッドが少し増えますが、とにかくこれは I/O バウンドです。そのオーバーヘッドがボトルネックになる場合は、スレッド プールを作成できます (そうなるとは思えませんが)。

アプリケーションがフォアグラウンドでなくなったことを本当に知りたい場合は、2 つのアクティビティ間で onStop/onResume のオーバーラップを使用できます。A->B から移行する場合、B の onResume は A の onStop の前に呼び出されます。したがって、onResume でグローバル カウンタをインクリメントし、onStop でデクリメントできます。アクティビティが表示されない場合に限り、そのカウンターは 0 になります。これを使用して、分析目的で正確な訪問を追跡しました. ただし、すべてのアクティビティに共通の基本クラスが必要です。

于 2011-09-16T21:53:50.440 に答える
3

あなたはandroid.app.Applicationクラスについて話しているのですか?アプリの開始時、アクティビティまたはサービスを開始する前に単一のアプリケーションが作成され、アプリがメモリに残っている限り存続します。

このアプリケーションを拡張して、そこにいくつかのグローバル データを配置することができます。<application android:name=".YourApp"> のマニフェストで、拡張クラスの名前を指定します。

ここで、アプリケーション自体はフォアグラウンドまたはバックグラウンドに移動せず、アクティビティのみが移動できることを理解する必要があります。ただし、Activity から getApplication を呼び出して単一の Application インスタンスを取得し (キャストを使用)、フォーカスの変更に関連する独自のメソッドを呼び出して、アプリ全体がフォアグラウンドにあるかバックグラウンドにあるかを把握し、必要に応じて動作させることができます。

また、サービスには、同じ Application オブジェクトを受け取る getApplication() メソッドもあります。

ほとんどの開発者は、一連のアクティビティとサービスだけでなく、必要なアプリ データを保持する単一の Application オブジェクトを使用できることに気付いていない可能性があります。

于 2011-09-16T20:54:55.777 に答える