определить, закрыто ли приложение из списка последних приложений или убито ОС - PullRequest
1 голос
/ 03 февраля 2020

Мне нужно выполнить вызовы API , если приложение закрыто.

onDestroy() и onStop() не будет запущено, если приложение будет закрыто из списка последних приложений или убит системой android. Но может быть обходной путь для этого?

Я пытался это & это

, когда я пытался (на Xiaomi note 7 Android 9) он терпит неудачу и не вызывает его тоже, и из комментариев все согласились с тем, что onTaskRemoved() больше не вызывается в Android O.

, поэтому любой может помочь мне найти способ достичь этого обходного пути, особенно в отношении Xiaomi, oppo, et c?

1 Ответ

1 голос
/ 03 февраля 2020

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

Я хотел бы поделиться ответом здесь, на SO , в котором попытается описать проблему уничтожения сервисов переднего плана.

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

Предложения, основанные на вашем сценарии использования:

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

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

  1. Решение со стороны сервера:
    1. Когда пользователь добавляет элемент в корзину, сохраните значение метки времени, когда он был добавлен в корзину, на стороне сервера. база данных.
    2. Возьмите порог по умолчанию для истечения срока годности товаров в корзине. Когда новый пользователь с другого устройства пытается получить доступ к тому же элементу, проверьте значение метки времени и отметьте этот элемент как доступный, если время прошло пороговое время.
  2. Решение со стороны сервера 2:
    1. ИМХО, предмет всегда доступен до тех пор, пока товар не будет извлечен / оплачен. В вашей реализации, если я смогу получить ваши конечные точки API, я могу провести простую атаку с использованием сценариев, чтобы я мог держать товар в корзине, не покупая его. Следовательно, в вашей текущей реализации есть серьезная уязвимость, которую можно легко использовать. Я предпочел бы хранить товар в корзине до тех пор, пока кто-нибудь не заплатит за него.
    2. Если вы держите товар в наличии для заказа, пока кто-то не заплатит за него, вы можете проверить наличие товара непосредственно перед совершением платежа и сообщить клиенту что предмет уже продан.
  3. Решение проблемы со стороны приложения:
    1. Я бы сказал, я не смог найти хороший способ убедиться, что API для отмены корзины был вызван для удаления элементов. из корзины Решение, которое я предложил ранее, все еще может работать, однако, ИМХО, это излишне.
    2. Если вы воспользуетесь реализацией onTaskRemoved, вы можете подумать о наличии там таймера, чтобы у вас также было пороговое значение для товаров, которые будут удалены из корзины по истечении определенного периода времени. В противном случае вы останетесь недоступным для других пользователей навсегда (как я уже говорил выше).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...