2013-07-20 2 views
8

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

То, что я пытался сделать, это создать службу в другом процессе, объявив это следующим образом:

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

Привет, вы пришли в раствор?Я искал несколько часов, чтобы решить эту проблему, и я не смог прийти к решению. Ваш код выглядит точно так же, как и мой. – OmarBizreh

+0

Я решил это, просто начав свою службу, используя эту строку: 'ContextWrapper cont = new ContextWrapper (getBaseContext()); \t \t \t cont.startService (услуги); ' – OmarBizreh

+0

связанные http://stackoverflow.com/questions/16651009/android-service-stops-when-app-is-closed –

ответ

4

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

android:isolatedProcess="true" 

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

+0

Эта библиотека очень старая. Будет ли хорошо использовать его? –

+0

Да, мы используем его широко. Не уверен, но я думаю, что он получает новые коммиты каждый раз, а не – Nativ

+1

Простое решение здесь, https://stackoverflow.com/a/46603241/1881527 –

0

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

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

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

+7

Я не понимаю, почему вы думаете, что он должен работать. Служба все равно умрет, когда пользователь закроет приложение. У меня в настоящее время есть TimerTask, который я объявляю из OnCreate() службы, и я не думаю, что объявление его из onStartCommand() будет делать трюк – Nativ

+3

Полностью мусорный ответ – Subho

+0

Это не работает, я сам пробовал , для Handler нет причин быть там. – XcodeNOOB

-6

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

Из документации услуги:

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

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

+0

Да, я видел эту строку, но все же, каждый раз, когда я закрываю приложение, сервис также разрушается. Кстати, я не знаю, имеет ли значение, но сервис реализует OnSensorListener, чтобы слушать изменения акселерометров (движения ..) – Nativ

+0

@powerX Как начать сервис? Вы привязываетесь к нему или с помощью 'startService'? – brillenheini

+0

Я использую startService с намерением, чтобы начать мой сервис – Nativ

1

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

+1

Я использовал 'START_REDELIVER_INTENT', но моя служба по-прежнему останавливается, когда пользователь закрывает приложение. –

+0

Я использовал 'START_STICKY', но моя служба все еще останавливается, даже приложение закрывается пользователем. –

0

Для этого вы можете использовать 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(); 
    } 

Эта задача непрерывно работать 3min

public void TASK() 
{ 
    //your task 

} 
Смежные вопросы