Подтвердить что ты не робот

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

Можно ли запускать эту службу всегда, когда приложение приостанавливается и что-то еще. Через некоторое время мое приложение переходит в режим паузы, и службы также останавливаются или останавливаются. Итак, как я могу запустить эту службу в фоновом режиме и всегда.

4b9b3361

Ответ 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;
    }

}