私のアプリにはちょっと難しい状況があります。新しいデータが利用可能かどうかを確認するために、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();