Можно ли удалить Android-приложение для удаления?

Мое приложение использует Google C2DM (push-уведомление) для уведомления пользователей о новой активности от друзей. После установки приложения я зарегистрирую устройство на серверах C2DM и сохраняю номер телефона пользователя. Поэтому я знаю, что пользователь использует мое приложение, и я могу отправить ему push-уведомления. Но что произойдет, если пользователи отключат мое приложение, есть ли способ поймать его в моем приложении? Или единственный способ поймать ошибку на моем сервере, когда я отправляю C2DM, и он недоступен, а затем помечать пользователя как неактивного?

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

Какое наилучшее решение для этого сценария?

Ответ 1

К сожалению, намерение ACTION_PACKAGE_REMOVED будет отправлено всем получателям, за исключением ваших собственных. Это подтверждено здесь.

Некоторые вопросы для вашего плана C2DM, так как я не очень хорошо знаком с ним. Если пользователь просто покидает свое устройство в течение длительного периода времени, это приведет к возникновению условия ошибки, которое вы используете? Как C2DM действительно сообщает "недоступное" устройство? Является ли это условием, которое возникает только тогда, когда оно пытается отправить push-уведомление и выходит из строя или оно, когда оно каким-то образом определяет, что оно достигает устройства, но не может быть правильно обработано? Очевидно, что во втором сценарии ваш план будет работать, но я вижу, что некоторые "ложные срабатывания" встречаются иначе.

Более старый вопрос SO для справки: android не получает Intent ACTION_PACKAGE_REMOVED в удаленном пакете

Ответ 2

Документация GCM объясняет эту ситуацию здесь:

https://developers.google.com/cloud-messaging/registration#how-uninstalled-client-app-unregistration-works

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

В основном, когда GCM пытается отправить следующее push-уведомление, устройство сообщит GCM, что принимающее приложение было удалено.

Что касается уведомления друзей о том, что их друзья больше не используют приложение, GCM отправит на ваш сервер уведомлений ошибку NotRegistered, когда произойдет этот сбой; это не будет немедленно, но можете ли вы использовать это?

Ответ 3

Служба Google C2DM работает в пассивном режиме, когда дело доходит до обнаружения удаленных приложений.

Первое push-уведомление после удаления вашего приложения (без регистрации из C2DM!!!) НЕ будет возвращать какую-либо ошибку в ответ. Однако второе push-уведомление вернет коды ошибок "недействительной регистрации" или "незарегистрированные", где вы можете понять, что приложение было удалено.

Причина в том, что серверы C2DM немедленно возвращают код ответа и только затем пытаются нажать клиент. Когда клиент отвечает, что приложение было удалено, оно удаляется с серверов C2DM. Следующая попытка нажатия немедленно вернет код ошибки.

Ответ 4

Да, но это довольно хаки. Метод основан на том факте, что первое, что делает андроид при удалении приложения, - это удаление вашего файла данных. Таким образом, вы можете использовать наблюдателя файлов для обнаружения удаления. Также вам нужно написать это в собственном коде. Если вы напишете свой код в java, ваше приложение будет удалено, прежде чем он сможет выполнить любой код. см. эту демонстрацию: https://github.com/sevenler/Uninstall_Statics

Ответ 5

Я знаю только один способ с ответом 200 сервера с сообщением "NotRegistered" в теле.

NotRegistered - Registration_id больше недействителен, например, пользователь удалил приложение или отключил уведомления. Отправитель должен прекратить отправку сообщений на это устройство.

Ответ 6

У меня есть несколько моментов, чтобы сказать вам,

  • Сообщество Android рекомендует использовать GCM вместо C2DM, поскольку он больше не доступен.
  • В android нет возможности для приложений получать уведомления о том, что приложение удаляется.
  • в GCM, если вы хотите прекратить отправку сообщений в удаленные приложения, вы можете ссылаться на этот

Когда вы отправляете сообщения на GCM с вашего сервера, вы получите строку ответа. В случае если вы получаете сообщение об ошибке "NotRegistered", вы должны удалить идентификатор регистрации из своей базы данных сервера, потому что приложение было удалено с устройства или оно не иметь широковещательного приемника, настроенного на получение com.google.android.c2dm.intent.RECEIVE intents. "

Ответ 7

Посмотрите на этот документ GCM: Отмена регистрации GCM

Вы никогда не должны отменить регистрацию своего приложения. Это берется со стороны сервера.