Геозонирование Android, когда приложение убито

Моим основным требованием было бы иметь службу, имеющую собственный процесс и инициирующую собственное событие геозоны. Я хочу, чтобы пользователь был уведомлен из центра уведомлений, когда он входит в геозону, даже если приложение убито.

Я читал о службах, и мне это кажется довольно ясным, документация по Android плотная, поэтому мне удалось понять, как запустить службу с собственным процессом, а также как она может взаимодействовать с приложением с помощью Messenger.

Затем есть этот пример кода от Google, показывающий, как использовать геозону с сервисами Google Play: Примеры геозоны Google

Что я обнаружил до сих пор, так это то, что мы должны использовать IntentService для запуска событий геозоны, и из документов, которые я прочитал, говорится, что IntentService завершает свою работу, когда его работа выполнена. И я также немного протестировал, похоже, что служба Intent убивает, когда убивает приложение, что меня не удивляет в отношении документации.

Итак, мой вопрос: как мы можем использовать сервис геозоны, имея собственный процесс? Можно ли избежать использования IntentService в этом отношении?

ИЗМЕНИТЬ:

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


person Tíbó    schedule 05.02.2015    source источник
comment
Почему пользователь хочет, чтобы вы тратили его оперативную память и ЦП на дополнительный процесс? Материалы геозоны Play Services специально разработаны, чтобы приложениям не приходилось поддерживать процесс, но при этом получать события геозоны.   -  person CommonsWare    schedule 06.02.2015
comment
@CommonsWare Не на всех устройствах есть сервисы Play. Лицензия от Google стоит OEM денег. Я бы не стал писать приложение, которое использует их без отката. Очень часто их не устанавливают в Азии, где царит низкая стоимость. Также незаконна установка на ПЗУ cusotm, поскольку у вас нет лицензии, хотя она обычно пиратская.   -  person Gabe Sechan    schedule 06.02.2015
comment
@GabeSechan: Не на всех устройствах есть сервисы Play — да, но OP использует сервисы Play, как указано в третьем абзаце вопроса и дополнительно указывается ссылкой на образец геозоны Play Services.   -  person CommonsWare    schedule 06.02.2015


Ответы (3)


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

В рамках этого сервиса я применил пример геозоны, который нашел в примерах Google. Он использует IntentService для запуска событий геозоны. Вместо того, чтобы использовать эту логику в своей деятельности, я использую ее в своем собственном сервисе. Теперь я могу получать уведомления, даже когда мое приложение убито.

person Tíbó    schedule 16.02.2015
comment
Эй, можете опубликовать код службы, которая продолжает работать, даже когда приложение убито? - person Ashwin Prasad; 27.09.2016
comment
Вы уверены, что должны это сделать? Он должен работать как есть, поскольку, как только это служба намерения, она должна запускаться, даже если приложение переходит в фоновый режим или уничтожается. - person Daniele; 14.10.2016
comment
пожалуйста, поделитесь своим сервисным кодом, если он работает в этом случае @Tibo - person Radhey; 03.10.2017

  1. Вам не нужно использовать отдельный процесс для этой цели (если вы не имеете в виду другие функции, о которых вы не сказали здесь вслух)
  2. Используйте WakefulBroadcastReceiver, который действительно идеально подходит для обработки событий перехода геозоны. .
person Marian Paździoch    schedule 06.02.2015
comment
конечно, может быть, я не все сказал, я отредактировал свой вопрос. Никогда не слышал о WakefullBroadcastReceiver, посмотрю! - person Tíbó; 06.02.2015

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

Удалите следующий код из своего действия, где вы упомянули код местоположения.

Удалите указанный код из своей активности

проверьте свой onPause()

@Override
protected void onPause() {
    super.onPause();

    //Comment out below code 
    LocationServices.FusedLocationApi.removeLocationUpdates(
            mGoogleApiClient, this);
}

проверьте свой код в onStop()

 @Override
protected void onStop() {
    super.onStop();
    //Comment out the below code if you have done in your activity to disconnect from google api client.

    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

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

person Pinakin Kansara    schedule 06.02.2015