0

フォアグラウンド サービスとして実行されているサービスがあります。

startForeground(1234, notification);

このサービスには、15 分ごとに実行する必要があるランナブルがあります。

private Runnable runnable = new Runnable()
{
    @Override
    public void run()
    {
        Log.d("maw", "Gps::run");
        if (Constants.checkInternet(getApplicationContext())) checkSheet();
        handler.postDelayed(this, Constants.REFRESH_TIME);
    }
};

デバイスがインターネットに接続されると、メソッド checkSheet() が実行されます。このメソッドは、サーバーでいくつかのものをチェックし、その結果に応じて GPS を起動し、デバイスの位置を追跡します。

locationMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIME, GPS_DISTANCE, this);

今...私たちのテストでは、これはすべて正常に機能しているようです。しかし、ログを開始してから数時間後にしかトレースが表示されない場合があるという点で、ユーザーには問題があります。

ここで問題になるのは、この背後にある理由は何かということです。彼らは私たちのデバイスほどデバイスを使用しておらず、デバイスはより頻繁にデバイスを使用するため、テストデバイスが決して入らないスリープモードになっていると推測しています

いくつかの質問: フォアグラウンド サービスの場合: - デバイスがより深いスリープ モードに移行すると、Runnable は 15 分ごとに実行を停止しますか? - デバイスがより深いスリープ モードにある場合、locationManager.requestLocationUpdates を初期化することはできませんか?

4

2 に答える 2

1

AlarmManagerを使用してみてください。そうすれば、サービスが実際に作業を行っているときにのみメモリ内にある必要があります。または、wakelockを使用できます。

于 2013-05-07T13:52:33.553 に答える
0

多くのテストの後、ランナブルが時々クラッシュし、完全に機能しなくなったようです。

その問題を修正した後、フォアグラウンド サービスの場合、Runnable は実行を継続し、locationManager.requestLocationUpdates は実行すべきことを実行しているようです。

于 2013-05-16T05:13:14.397 に答える