GPS/ネットワークの場所を読み取るサービスをバックグラウンドで実行しており、次のことを行う必要があります。
アプリの再起動時に中断することなくバックグラウンドで実行し、殺されることなく可能な限り存続させます (これは、以下のマーリンのコメントの助けを借りて解決されます)
受信した新しい場所で、Web サービスを呼び出して、読み取った場所を送信します
60 秒ごとに反復タスクを実行し、最後の位置情報を Web サービスに再送信します。これは、ユーザーが同じ位置に留まっている場合に役立ちます。
私が考えたことがいくつかありますが、正しく理解できたかどうかはわかりません。サービスはメイン アプリと同じスレッドで実行されるため、UI スレッドと同じスレッドでサーバーに場所を送信すると、UI がフリーズする可能性があり、これは適切ではありません。また、GPS/ネットワーク リスナーが独自のスレッドを持っているか、アプリと同じスレッドを使用しているかどうかもわかりません。
わかりやすくするために、サービスの短縮コードを次に示します。
public class GPSLoggerService extends Service {
@Override
public void onCreate() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 50, locationListenerNetwork);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
updateLocation(lastLocation);
}, 60, 60, TimeUnit.SECONDS);
return START_STICKY;
}
LocationListener locationListenerGps = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
LocationListener locationListenerNetwork = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
private void updateLocation(Location readLocation) {
//web service call
String response = WebServiceCalls.updateLocation(readLocation);
//log data in a local Sqlite database
saveLocation(readLocation)
}
私の主な関心事は、 updateLocation 呼び出しを処理し、それをメイン アプリ スレッドとは別のスレッドにする方法です。scheduleTaskExecutor 私はそれが行くべき道ではないと信じています。場合によっては、stopService() を呼び出した後でも、TaskExecutor にシャットダウンするように指示しても、サービスが存続することがあります。サービスが停止していない別の説明が見つかりません。要約すると、リスナーが新しい場所を受信するたびに場所を送信し、60 秒ごとに再送信する必要があります。また、アクティブなスレッドをキャンセルして、サービスをすばやく停止できるようにする必要もあります。
私のケースをどのように処理することをお勧めしますか?