Как запустить службу Android в фоновом режиме после того, как она была удалена недавней активностью?

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

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

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

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


person Android_Noob    schedule 22.01.2015    source источник


Ответы (2)


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

если процесс этой службы завершается во время его запуска (после возврата из 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);
        }

    };
}
person user1140237    schedule 22.01.2015
comment
На самом деле такое поведение вызвано ошибкой в системе, и не зависит от липкости сервиса. - person corsair992; 22.01.2015
comment
@corsair992 я тестировал в 4.4.4, он работает нормально, но не тестировался в 4.4.0, 4.4.1 и .2 .. проверю и обновлю .. спасибо за указание .. :) - person user1140237; 22.01.2015

Создайте для этого липкий сервис:

@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) после создания нового экземпляра службы; если нет ожидающих команд запуска, которые должны быть доставлены в службу, она будет вызываться с нулевым объектом намерения.

person Anjali    schedule 22.01.2015