Czy można wykryć odinstalowanie aplikacji na Androida?

Moja aplikacja korzysta z Google C2DM (push notification), aby powiadamiać użytkowników o nowej aktywności od znajomych. Po zainstalowaniu aplikacji rejestruję urządzenie za pomocą serwerów C2DM i zapisuję numer telefonu użytkownika. Wiem więc, że użytkownik korzysta z mojej aplikacji i mogę wysyłać mu powiadomienia push. Ale co się stanie, jeśli użytkownicy odinstalują moją aplikację, czy istnieje sposób, aby ją złapać w mojej aplikacji? Czy jedynym sposobem jest złapanie błędu na moim serwerze, gdy wysyłam C2DM i jest nieosiągalny, a następnie oznaczyć użytkownika jako nieaktywnego?

Chciałbym powiadomić użytkowników, gdy ich znajomi korzystają z aplikacji, a kiedy już tego nie robią.

Jakie jest najlepsze rozwiązanie dla tego scenariusza?

Author: android-developer, 2011-06-02

7 answers

Niestety intencja ACTION_PACKAGE_REMOVED zostanie wysłana do wszystkich odbiorców z wyjątkiem twojego. Jest to potwierdzone tutaj.

Kilka pytań do twojego planu C2DM, ponieważ nie znam go zbyt dobrze. Jeśli użytkownik po prostu pozostawia swoje urządzenie wyłączone na długi okres czasu, czy spowoduje to stan błędu, którego używasz? Jak C2DM rzeczywiście zgłasza "nieosiągalne" urządzenie? Jest to warunek, który występuje tylko wtedy, gdy próbuje wysłać powiadomienie push i nie powiedzie się lub jest kiedy w jakiś sposób stwierdzi, że dociera do urządzenia, ale nie jest prawidłowo obsługiwany? Oczywiście w drugim scenariuszu twój plan zadziałałby, ale widzę, że niektóre "fałszywe alarmy" występują inaczej.

Starsze więc pytanie do referencji: android nie odbiera Intent ACTION_PACKAGE_REMOVED w usuniętym pakiecie

 19
Author: MattC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:03

Dokumentacja GCM wyjaśnia tę sytuację tutaj:

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

" aplikacja może zostać automatycznie wyrejestrowana po jej odinstalowaniu z urządzenia. Jednak ten proces nie dzieje się od razu, ponieważ Android nie zapewnia odinstalowywania połączenia zwrotnego."

Zasadniczo, gdy GCM próbuje wysłać następne powiadomienie push, urządzenie poinformuje GCM o odbieranie aplikacji zostało odinstalowane.

Jeśli chodzi o powiadamianie znajomych, że ich znajomi nie używają już aplikacji, GCM wyśle błąd NotRegistered do serwera powiadomień, gdy ta awaria wystąpi; nie będzie to natychmiastowe, ale czy możesz tego użyć?

 44
Author: Andrew Wyld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-30 15:21:54

Usługa Google C2DM działa w trybie pasywnym, jeśli chodzi o wykrywanie odinstalowanych aplikacji.

Pierwsze powiadomienie push po odinstalowaniu aplikacji (bez wyrejestrowania z C2DM!!!) nie zwróci żadnego błędu w odpowiedzi. Jednak drugie powiadomienie push zwróci kody błędów "nieprawidłowa rejestracja" lub "Niezarejestrowana", dzięki którym możesz zdać sobie sprawę, że aplikacja została odinstalowana.

Powodem jest to, że serwery C2DM natychmiast zwracają kod odpowiedzi i dopiero wtedy próbuje nacisnąć klienta. Gdy Klient odpowiada, że aplikacja została odinstalowana, jest usuwana z serwerów C2DM. Następna próba natychmiast zwróci kod błędu.

 7
Author: Zamel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 16:05:46

Tak, ale jest dość szorstki. Metoda ta opiera się na fakcie, że pierwszą rzeczą, którą robi android podczas odinstalowywania aplikacji, jest usunięcie pliku danych. Więc możesz użyć kontroli plików, aby wykryć usunięcie. Musisz również napisać to w natywnym kodzie. Jeśli napiszesz kod w Javie, Twoja aplikacja zostanie odinstalowana, zanim będzie mogła wykonać dowolny kod. zobacz to demo: https://github.com/sevenler/Uninstall_Statics

 7
Author: Roland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-20 06:31:51

Znam tylko jeden sposób z odpowiedzią serwera 200 z Komunikatem" NotRegistered " w treści.

NotRegistered - registration_id nie jest już ważny, na przykład użytkownik odinstalował aplikację lub wyłączył powiadomienia. Nadawca powinien przestać wysyłać wiadomości do tego urządzenia.

 3
Author: mobiledev Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-04 09:31:46

Mam kilka punktów do powiedzenia,

    Społeczność Androida zaleca używanie GCM zamiast C2DM, ponieważ nie jest już dostępna.
  1. w Androidzie nie ma możliwości, aby aplikacje otrzymały powiadomienie, że aplikacja jest odinstalowywana.
  2. w GCM jeśli chcesz przestać wysyłać wiadomości do odinstalowanych aplikacji możesz odwołać się do tego

Kiedy wysyłasz wiadomości do GCM z serwera otrzymasz odpowiedź string.In że jeśli otrzymujesz błąd jako "Niezarejestrowany, należy usunąć identyfikator rejestracji z bazy danych serwera, ponieważ aplikacja została odinstalowana z urządzenia lub nie ma odbiornika telewizyjnego skonfigurowanego do odbioru com.google.android.c2dm.intencja.Przyjmij intencje."

 3
Author: Zubair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 06:46:39

Zajrzyj do tego GCM doc: GCM

Nigdy nie należy wyrejestrować aplikacji. Odbywa się to od strony serwera.

 2
Author: Siddharth_Vyas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 11:49:43