0

私のアプリにはちょっと難しい状況があります。新しいデータが利用可能かどうかを確認するために、60 秒ごとにリモート サーバーに接続するメカニズムを実装しました。その場合、新しいデータがアプリに表示されます。ここまでは順調ですね。

次の方法でメカニズムを実装しました。

  • onCreate()MainActivityのメソッドで開始されます。
  • MainActivity のonDestroy()メソッドでポーリング ルーチンが停止します。

これにより、アプリが実行されている限り、ポーリングが常にアクティブになります。また、MainActivity から別のアクティビティを開始する場合は、ポーリングも実行する必要があります。

私の問題:

Back-Buttonを介してアプリケーションを終了すると、すべてが正常に機能し、ポーリングが停止します。しかし、ホーム ボタンを使用してアプリケーションを終了すると、MainActivity が呼び出されないため、ポーリング ルーチンは存続しますonDestroy()が、停止したいと考えています。

onPause()コードを変更して、MainActivityのメソッドでポーリング ルーチンを停止すると、新しいアクティビティを起動したときにポーリングも停止するという問題があります。

私が欲しいもの:

アプリケーション (MainActivity ではない) がフォアグラウンドにある/ユーザーに表示されている限り、ポーリングを実行したいと考えています。ユーザーがアプリ内の任意の場所からホームボタンを押すか、MainActivity から戻るボタンを押してアプリケーションを終了するとすぐに、ポーリングを停止します。

追加:

また、アクティビティを切り替えるたびにサービスを再起動したり停止したりしたくありません。私のアプリケーションのユーザーはアクティビティを頻繁に切り替えるため、これはかなりのオーバーヘッドになります。さらに、「リフレッシュ」サイクルを正確に 60 秒にしたいと考えています。常にサービスを再起動して再度停止すると、保証できません。アプリの開始時に一度開始し、アプリがフォアグラウンドでなくなったときに停止する必要があります。

それを達成する方法は?

アプリがフォアグラウンドにあるときと、非表示/閉じているときを確認する簡単な方法はありませんか?

これは私のシングルトンポーリングメカニズムです:

private Timer t;
private static Updater instance;

protected Updater() {
      // Exists only to defeat instantiation.
}

public static Updater getInstance() {

    if(instance == null) {
        instance = new Updater();
    }

    return instance;
}

public void startPollingRoutine(int interval, int delay) {      

    t = new Timer();

    // Set the schedule function and rate
    t.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {

            update(); // some asynctask that does the updating
        }

    }, delay, interval);
}

public static void stopPollingRoutine() {
    t.cancel();
}

コード内:

Updater.getInstance().startPollingRoutine(60000, 0);
Updater.getInstance().stopPollingRoutine();
4

4 に答える 4

1

サービスを作成し、メインクラスでそれをトリガーする必要があります。破壊時に明示的に停止しない限り、サービスがトリガーされます onBackpressed()/onDetroy() を意味し、 onPause() メソッドで実行させます

于 2013-09-26T19:38:16.743 に答える
1

シングルトンを使用し、カウンター変数を持たせます。新しいアクティビティを開始するインテントを送信するときに増やし、onPause で減らします。ポーリングを停止する必要があるかどうかがわかります。シングルトンのカウンターがゼロのとき。

于 2013-09-26T19:41:32.220 に答える
0

ご協力いただき、ありがとうございました。 最終的に、すべての要件を満たすソリューションを自分で見つけました。

このチュートリアルに従って動作させました: http://www.mjbshaw.com/2012/12/determining-if-your-android-application.html

基本的な考え方は、Application クラスを拡張し、特定の時間に「生きている」アクティビティの数を参照し続けることです。

于 2013-09-26T23:57:22.403 に答える