FusedLocationProvider を使用して位置追跡アプリケーションに取り組んでいます。5 分ごとに電話の位置を追跡するバックグラウンド サービスがあります。
すべてがうまく機能しますが、電話がアイドル状態になると、3〜4時間後にバックグラウンドサービスが停止して場所を取得します. ユーザーが電話のロックを解除すると、追跡が再開されます。
誰かが問題の原因を教えてくれますか?
FusedLocationProvider を使用して位置追跡アプリケーションに取り組んでいます。5 分ごとに電話の位置を追跡するバックグラウンド サービスがあります。
すべてがうまく機能しますが、電話がアイドル状態になると、3〜4時間後にバックグラウンドサービスが停止して場所を取得します. ユーザーが電話のロックを解除すると、追跡が再開されます。
誰かが問題の原因を教えてくれますか?
Android は、しばらくアイドル状態になった後、サービスをスリープ状態にします。WakeLockを使用して、それを防ぐことができます。
public int onStartCommand (Intent intent, int flags, int startId)
{
PowerManager mgr = (PowerManager)getSystemService(Context.POWER_SERVICE);
mWakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
mWakeLock.acquire();
...
return START_STICKY;
}
public void onDestroy(){
...
mWakeLock.release();
}
電話がメモリを解放してサービスを強制終了する必要があるため、サービスが停止している可能性があります。サービスがフォアグラウンド サービスとして設定されていることを確認します。
フォアグラウンド サービスは、ユーザーが積極的に認識しているものと見なされるサービスであるため、メモリが不足しているときにシステムが強制終了する候補にはなりません。フォアグラウンド サービスは、ステータス バーに通知を表示する必要があります。ステータス バーは "継続中" という見出しの下に表示されます。つまり、サービスを停止するか、フォアグラウンドから削除しない限り、通知を閉じることはできません。 http://developer.android.com/guide/components/services.html
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);