Поддержание фоновой службы после выхода из приложения пользователя
Я пытаюсь создать службу, которая будет выполнять фоновые задания для меня даже после того, как пользователь закроет приложение из меню запущенных процессов (путем смещения процесса с экрана).
Я попытался создать сервис в другом процессе, объявив его так:
<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 - это самый простой способ начать внедрение службы.