Android

Android Service needs to run always (Never pause or stop)

Служба 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

"Возможно ли запускать эту службу всегда, как при приостановке приложения, так и при чем-либо еще?"

ДА.


  1. В методе service onStartCommand возвращается START_STICKY .


    public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
    }

  2. Запустите службу в фоновом режиме с помощью startService (MyService), чтобы она всегда оставалась активной, независимо от количества привязанных клиентов.


    Intent intent = new Intent(this, PowerMeterService.class);
    startService(intent);

  3. Создайте связующее.


    public class MyBinder extends Binder {
    public MyService getService() {
    return MyService.this;
    }
    }

  4. Определите подключение к службе.


    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;
    }
    };

  5. Привязка к службе с помощью bindService.


            Intent intent = new Intent(this, MyService.class);
    bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);

  6. Для вашей службы может потребоваться уведомление о запуске соответствующего действия после ее закрытия.


    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());
    }

  7. Вам необходимо изменить манифест, чтобы запустить действие в режиме single top.


              android:launchMode="singleTop"

  8. Обратите внимание, что если системе нужны ресурсы, а ваша служба не очень активна, она может быть отключена. Если это неприемлемо, выведите службу на передний план с помощью 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

Если у вас уже есть служба и вы хотите, чтобы она работала постоянно, вам нужно добавить 2 вещи:


  1. в самой службе:


    public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
    }

  2. В манифесте:


    android:launchMode="singleTop"

Нет необходимости добавлять bind, если это не нужно в службе.

Ответ 4

Простое решение - перезапустить службу, когда система ее останавливает.

Я нашел очень простую реализацию этого метода:

Как сделать службу Android неостановимой

2023-06-11 09:38 java android service