私のアプリでは、ユーザーが位置情報の更新を要求します。これが発生すると、メインアクティビティはロケーションリクエストを開始するサービスを開始します。
私の問題は、サービスが開始された場合、たとえば2分間に3回開始された場合、正しく動作しないことです。
したがって、基本的には、現在の開始が完全に終了するまで開始要求を保留にするサービスが必要です。
サービスが開始されるたびに、サービスが完了するまでに最大10分かかる場合があり、サービスは、渡されたインテントデータに基づいて、各開始リクエストに異なる方法で応答します。
2分間に発生した3つの開始リクエストごとに1つのロケーションリクエストがあることを嬉しく思います(実際には好まれます)が、インテントデータは3つのスタートリクエストのそれぞれとは異なる場合があります。
そこで、IntentServiceを使用してこれを克服し、3つのリクエストすべてを一度に1つずつ処理しようとしましたが、
LocationManager.requestLocationUpdates(...)
は呼び出されません。これは、onHandleIntent(...)がほぼ即座に終了し、基本的にロケーションリクエストに応答する時間を与えていないことが原因である可能性が高いことを理解しています。7分(テストでは3分)後にロケーションリクエストを停止するハンドラーがあります。その後、ロケーション情報が他のメソッドに渡され、UIの更新がユーザーに返されます。UIの更新が返されます。場所の更新が失敗するため、UIの更新はnullになります。
IntentServiceでonHandleIntentを使用してサービスを開始し、インテントデータを渡すことができると思いますが、それは本当に悪い習慣のようであり、おそらくそれを行うためのより良い方法があります。 編集: onHandleIntentはとにかく私のlocationServiceをすぐに開始するので、それは間違いなく機能しません。したがって、待機期間はありません。
また、onHandleIntent内で呼び出されたトーストはまったく表示されませんが、onCreate()からのすべてが正常に機能します。
私はこれに対する答えを見つけるのに本当に苦労しています、そしてどんな助けも大いにありがたいです。これが私のコードの要点です:
public class myService extends IntentService {
public findMyDroidService() {
super("findMyDroidService");
}
@Override
protected void onHandleIntent(Intent intent){
intent.getExtras();
fromIntentString = intent.getStringExtra("toIntentStringExtra");
Toast.makeText(this, fromIntentString, Toast.LENGTH_SHORT).show();
Toast.makeText(this, "Intent Handled", Toast.LENGTH_SHORT).show();
locMan.requestLocationUpdates(locListener,...);
}
@Override
public void onCreate(){
super.onCreate();
locListener = new LocationListener(){
//code goes here
}
}
}
また、ロケーションリスナーはonCreate()内でインスタンス化されます。