Служба Android должна запускаться всегда (никогда не останавливать или останавливать)
Я создал службу и хочу запускать эту службу всегда, пока мой телефон не запустится или не закроется. Служба должна работать в фоновом режиме.
Пример кода созданных сервисов и сервисов запуска:
Запустить службу:
Intent service = new Intent(getApplicationContext(), MyService.class);
getApplicationContext().startService(service);
Сервис:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful
HFLAG = true;
//smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000);
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO for communication return IBinder implementation
return null;
}
}
Декларация манифеста:
<service
android:name=".MyService"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
</service>
Можно ли запускать эту службу всегда, когда приложение приостанавливается и что-то еще.
Через некоторое время мое приложение переходит в режим паузы, и службы также останавливаются или останавливаются.
Итак, как я могу запустить эту службу в фоновом режиме и всегда.
Ответы
Ответ 1
"Возможно ли запустить эту службу всегда, как при паузе приложения и что-нибудь еще?"
Да.
-
В сервисе onStartCommand метод возвращает START_STICKY.
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
-
Запустите службу в фоновом режиме, используя startService (MyService), чтобы он всегда оставался активным, независимо от количества связанных клиентов.
Intent intent = new Intent(this, PowerMeterService.class);
startService(intent);
-
Создайте связующее.
public class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
-
Определите сервисное соединение.
private ServiceConnection m_serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
m_service = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
m_service = null;
}
};
-
Привязать к службе с помощью bindService.
Intent intent = new Intent(this, MyService.class);
bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
-
Для вашей службы вам может потребоваться уведомление о запуске соответствующей деятельности после ее закрытия.
private void addNotification() {
// create the notification
Notification.Builder m_notificationBuilder = new Notification.Builder(this)
.setContentTitle(getText(R.string.service_name))
.setContentText(getResources().getText(R.string.service_status_monitor))
.setSmallIcon(R.drawable.notification_small_icon);
// create the pending intent and add to the notification
Intent intent = new Intent(this, MyService.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
m_notificationBuilder.setContentIntent(pendingIntent);
// send the notification
m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build());
}
-
Вам нужно изменить манифест для запуска активности в режиме с одним верхним уровнем.
android:launchMode="singleTop"
-
Обратите внимание, что если системе нужны ресурсы, и ваш сервис не очень активен, он может быть убит. Если это неприемлемо, принесите сервис на передний план, используя startForeground.
startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
Ответ 2
Чтобы запустить службу в своем собственном процессе, вы должны указать следующее в объявлении xml.
<service
android:name="WordService"
android:process=":my_process"
android:icon="@drawable/icon"
android:label="@string/service_name"
>
</service>
Здесь вы можете найти хороший учебник, который был мне очень полезен
http://www.vogella.com/articles/AndroidServices/article.html
Надеюсь, что это поможет
Ответ 3
Простым решением является перезапуск службы, когда система останавливает ее.
Я нашел эту очень простую реализацию этого метода:
Как отключить службу Android
Ответ 4
Вы можете реализовать startForeground
для службы, и даже если он умрет, вы можете перезапустить его, используя START_STICKY
on startCommand()
. Не уверен, хотя это правильная реализация.
Ответ 5
Если у вас уже есть служба и вы хотите, чтобы она работала все время, вам нужно добавить 2 вещи:
-
в самой службе:
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
-
В манифесте:
android:launchMode="singleTop"
Не нужно добавлять привязку, если она вам не нужна.
Ответ 6
Я нашел простой и понятный способ всегда поддерживать Service
.
Этот парень объяснил это так ясно и использовал хороший алгоритм. Его подход заключается в отправке широковещательной передачи, когда служба собирается убить, а затем использовать ее для перезапуска службы.
Вы должны проверить это: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android
Ответ 7
Добавьте это в манифест.
<service
android:name=".YourServiceName"
android:enabled="true"
android:exported="false" />
Добавить класс службы.
public class YourServiceName extends Service {
@Override
public void onCreate() {
super.onCreate();
// Timer task makes your service will repeat after every 20 Sec.
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
// Add your code here.
}
});
}
};
//Starts after 20 sec and will repeat on every 20 sec of time interval.
timer.schedule(doAsynchronousTask, 20000,20000); // 20 sec timer
(enter your own time)
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful
return START_STICKY;
}
}