2015-01-22 6 views
1

У меня есть служба, которая всегда должна работать. Он должен ждать входящих писем электронной почты, когда приходит электронное письмо (на мой старый телефон), это вызовет действие. (отправить смс на мой новый телефон). Не умный пользовательский случай, а просто изучение Android.Как запустить службу Android в фоновом режиме после того, как она была удалена из недавней активности?

Однако все вышеописанное отлично работает, если я сохраняю приложение в «Недавних» приложениях. В тот момент, когда я удаляю его, это не сработает.

Любая идея о том, как я могу это достичь?

В некоторых приложениях, таких как Whatsapp, Facebook и т. Д., Я видел, что даже после того, как мы удалились, есть фоновый сервис для прослушивания нового уведомления и т. Д. Как достичь с моим приложением?

+0

http://stackoverflow.com/questions/9093271/start-sticky-and-start-not-sticky – aga

+0

Можете ли вы поделиться тем, что вы пробовали? –

+0

Возможный дубликат [START \ _STICKY не работает на Android KitKat (Edit: And Jelly Bean)?] (Http://stackoverflow.com/questions/20636330/start-sticky-does-not-work-on-android- kitkat-edit-and-jelly-bean) – corsair992

ответ

1

Для этого вам необходимо сделать сервис липкой возврата START_STICKY onStartCommand службы. и в доке его mentioed, если процесс будет убит система обновит снова

если процесс этого сервиса будет убит в то время как он был запущен (после возвращения из onStartCommand (Intent, Int, Int)), а затем оставить его в начал состояние, но не сохранил это заданное намерение. Позже система попытается воссоздать сервис. Поскольку он находится в начальном состоянии, будет гарантировать вызов onStartCommand (Intent, int, int) после , создавая новый экземпляр службы; если нет ожидающих запуска команд , которые будут доставлены в службу, он будет вызываться с нулевым объектом цели , поэтому вы должны позаботиться об этом.

public class MyService extends Service { 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.app.Service#onBind(android.content.Intent) 
    */ 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     handler.postDelayed(run, 1000); 
     return Service.START_STICKY; 
    } 

    private Runnable run = new Runnable() { 

     @Override 
     public void run() { 
      handler.removeCallbacks(run); 
      handler.sendEmptyMessage(0); 
     } 
    }; 
    private Handler handler = new Handler() { 

     /* 
     * (non-Javadoc) 
     * 
     * @see android.os.Handler#handleMessage(android.os.Message) 
     */ 
     @Override 
     public void handleMessage(Message msg) { 
      Log.e("handleMessage", "" + System.currentTimeMillis()); 
      handler.postAtTime(run, 1000); 
     } 

    }; 
} 
+1

Это поведение фактически вызвано [ошибкой] (https://code.google.com/p/android/issues/detail?id=63618) в системе и является не затронутых липкостью обслуживания. – corsair992

+0

@ corsair992 i hve проверен в 4.4.4, его рабочий тон, проверенный в 4.4.0, 4.4.1 и .2 .. проверяет и обновляет его .. thnks для указания .. :) – user1140237

0

Создать липкую услугу для этого:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We want this service to continue running until it is explicitly 
    // stopped, so return sticky. 
    return START_STICKY; 
} 

START_STICKY если процесс этого сервиса будет убит в то время как он был запущен (после возвращения из onStartCommand (Intent, Int, Int)), а затем оставить его в запущенном состоянии, но не сохраняйте это поставленное намерение. Позже система попытается воссоздать сервис. Поскольку он находится в начальном состоянии, он будет гарантировать вызов onStartCommand (Intent, int, int) после создания нового экземпляра службы; если в службу не будут отправляться ожидающие стартовые команды, он будет вызываться с объектом нулевого намерения.