Я пытаюсь создать сервис, который каждую минуту запрашивает местоположение устройства.Мне нужно, чтобы это работало в фоновом режиме, даже когда приложение закрыто.До сих пор мне удавалось заставить его работать на устройствах с предустановленной ОС Android, но сейчас я тестирую службу на устройстве Android Oreo и не работает, когда я закрываю приложение или помещаю его в фоновый режим.В своем исследовании я обнаружил, что для устройств Oreo следует использовать Службу Foreground с постоянным уведомлением, чтобы начать с этого, для начала я реализовал простую Службу Foreground, подобную приведенной ниже, которая при запуске показывает текущее уведомление, а при остановке уведомленияудален.
public class MyForegroundService extends Service {
private static String TAG = MyForegroundService.class.getSimpleName();
private static final String CHANNEL_ID = "channel_01";
private static final int NOTIFICATION_ID = 12345678;
private NotificationManager mNotificationManager;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public MyForegroundService() {
super();
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Android O requires a Notification Channel.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.app_name);
// Create the channel for the notification
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_DEFAULT);
// Set the Notification Channel for the Notification Manager.
mNotificationManager.createNotificationChannel(mChannel);
}
startForeground(NOTIFICATION_ID, getNotification());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
stopForeground(true);
}
private Notification getNotification() {
// Get the application name from the Settings
String appName = PrefApp.getSettings(getApplicationContext()).getAppConfigs().getAppName();
String applicationKey = PrefApp.getSettings(getApplicationContext()).getAppConfigs().getAppKey();
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setContentTitle(appName)
.setContentText("Services are running")
.setOngoing(true)
.setPriority(Notification.PRIORITY_HIGH)
.setSmallIcon(R.mipmap.ic_notification)
.setWhen(System.currentTimeMillis());
// Set the Channel ID for Android O.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(CHANNEL_ID); // Channel ID
}
return builder.build();
}
}
Я запускаю и останавливаю вышеуказанную службу, используя приведенные ниже функции.
public void startMyForegroundService() {
Log.d(TAG, "Start Foreground Service");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(new Intent(getApplicationContext(), MyForegroundService.class));
} else {
startService(new Intent(getApplicationContext(), MyForegroundService.class));
}
}
public void stopMyForegroundService() {
Log.d(TAG, "Stop Foreground Service");
stopService(new Intent(getApplicationContext(), MyForegroundService.class));
}
Я проверяю вышеуказанную службу, и по какой-то причине служба убивается послеоколо 30 минут с момента его запуска.Может кто-нибудь сказать мне, если я делаю что-то не так, или, возможно, направить меня для решения, которое может работать для меня?
Примечание: я следовал этому учебнику и также проверял их применениеи что это все еще не работает.Через некоторое время служба закрывается.
В основном моя цель - реализовать службу, которая может работать в фоновом режиме (даже если приложение закрыто) и получать обновления местоположения каждую минуту.