Поддержание фоновой службы после выхода из приложения пользователя

Я пытаюсь создать службу, которая будет выполнять фоновые задания для меня даже после того, как пользователь закроет приложение из меню запущенных процессов (путем смещения процесса с экрана).

Я попытался создать сервис в другом процессе, объявив его так:

  <service
        android:name=".service.Service"
        android:enabled="true"
        android:icon="@drawable/ic_launcher"
        android:process=":my_process" >
  </service>

и onStartCommand():

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

5 ответов

Решение

Согласно документации Android вы можете добиться такого поведения с помощью атрибута:

 android:isolatedProcess="true"

Кстати, я знаю, что он не отвечает на вопрос, но может помочь и некоторым людям - в последнее время я узнал о замечательной сторонней библиотеке, созданной разработчиками Evernote. Это имя Android-Job, и его цель - создавать задания, которые выполняются в разных процессах и могут снова стать активными даже после перезагрузки устройства, это удивительно.

На самом деле существуют различные виды услуг, которые вы можете реализовать. Используйте Сервис вместо IntentService, Там нужно посмотреть на START_STICKY, START_NOT_STICKY а также START_REDELIVER_INTENT вы можете поддерживать свою службу в фоновом режиме, даже если ваша активность прекратится. Сервисы Android также смотрят на AIDL Сервисы

Для этого вы можете использовать класс Handler и Runnable

   @Override
    public void onCreate()
    {

        Toast.makeText(context, "SMS SERVICE START", Toast.LENGTH_SHORT).show();


        handler=new Handler();
        runnable=new Runnable() {
            @Override
            public void run()
            {

                    TASK();
                    handler.postDelayed(runnable,180000);
// 3min delay
            }
        };

        handler.postDelayed(runnable,180000);
        super.onCreate();
    }

Эта задача выполняется непрерывно 3 минуты

public void TASK()
{
     //your task 

}

Один из способов сделать это. Предположим, у вас есть класс обслуживания с именем "DoSomething". В Android Manifest Объявляет:

<service android:name = ".DoSomething"></service>

В классе обслуживания:

Handler handler = new Handler();

Runnable runnable = new Runnable(){

    @Override
    public void run() {
        // TODO Auto-generated method stub
        YourMethod();
        handler.postDelayed(this, 1000); // 1000 - Milliseconds
    }
 };

И наконец:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub


     handler.postDelayed(runnable, 1000);

     return START_STICKY;
}

Из вашей деятельности:

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

Я надеюсь, что это помогает.

Сервисы были разработаны для работы в фоновом режиме, нет необходимости в другом процессе.

Из сервисной документации:

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

Сервис, однако, должен прекратить сам, когда его работа сделана. IntentService - это самый простой способ начать внедрение службы.

Другие вопросы по тегам