In Android O(8.0.0+)(API 26+)、アプリがバックグラウンドまたは強制終了のときに位置情報サービスの更新を取得する方法。In "Strava" Androidアプリ( Playストア で利用可能)、アプリがバックグラウンドまたはキルのときに位置情報サービスが適切に実行されます。アプリで同じ機能を構築する必要があります。
startService(new Intent(this, GpsServices.class));
次に、onDestroyメソッドは、アプリがアイドルモード(アプリがバックグラウンドまたは強制終了)である10秒後に呼び出されます。以下は私のコードです。
public class GpsServices extends Service implements LocationListener, Listener {
@Override
public void onCreate() {
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (mLocationManager != null) {
mLocationManager.addGpsStatusListener(this);
}
if (mLocationManager != null) {
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
500,
0,
this);
}
}
public void onLocationChanged(Location location) {
System.out.println("location = [" + location + "]");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
/* Remove the locationlistener updates when Services is stopped */
@Override
public void onDestroy() {
try {
mLocationManager.removeUpdates(this);
mLocationManager.removeGpsStatusListener(this);
stopForeground(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
任意の助けをいただければ幸いです。
以下の2つのオプションのいずれか、または両方の組み合わせを試すことができます。これにより、直面したときに問題が解決しました。
位置情報の更新をバックグラウンドで実行し続けるには、 LocationServices
API を FusedLocationProviderClient
と一緒に使用する必要があります here =および here ドキュメント内または here CODEPATH内。
Android Oreo 8.0ドキュメントを here のどこかに適切に読んだら、このソリューションにたどり着いたでしょう。
ステップ1:以下のコードに示されているように、必ずフォアグラウンドサービスとしてサービスを開始してください
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
mainActivity.startService(new Intent(getContext(), GpsServices.class));
mainActivity.startService(new Intent(getContext(), BluetoothService.class));
mainActivity.startService(new Intent(getContext(), BackgroundApiService.class));
}
else {
mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
mainActivity.startForegroundService(new Intent(getContext(), BluetoothService.class));
mainActivity.startForegroundService(new Intent(getContext(), BackgroundApiService.class));
}
ステップ2:通知を使用して、サービスが実行されていることを示します。
onCreate
サービスメソッドに以下のコード行を追加します。
@Override
public void onCreate() {
...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForeground(NOTIFICATION_ID, notification);
}
...
}
ステップ3:サービスが停止または破棄されたら、
notification
を削除します。
@Override
public void onDestroy() {
...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
stopForeground(true); //true will remove notification
}
...
}
オプション2の1つの問題は、実行中のすべてのデバイスでnotification
が実行されるまでGpsService
を表示し続けることです。 onAndroid Oreo 8.0.
これらのオプションは両方とも、アプリがバックグラウンドまたはキル状態にある場合でも機能すると確信しています。
この解決策があなたの問題を解決することを願っています。
この問題を解決する鍵は、通知ジェネレーターのようです。次のリンクは、私が要約できるよりも優れた実用的なソリューションを説明しています。
https://hackernoon.com/Android-location-tracking-with-a-service-80940218f561