Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Как отловить событие запуска любого приложения?

#java #android #android_service


Задача: нужно при запуске любого приложения выводить Toast с текстом "такое-то приложение
запустилось", а когда приложение закрывается (через finish(), или кнопкой Назад — без
разницы), вне зависимости от того, работают ли Service этого приложения, или нет, —
опять же, показать Toast с текстом "такое-то приложение завершилось". 

Например, запустил Play Market — получил Toast: "Play маркет запутился".

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


Ответы

Ответ 1



Можно попробовать использовать AccessibilityService и отлавливать событие TYPE_WINDOW_STATE_CHANGED public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) { switch (accessibilityEvent.getEventType()) { case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: if (accessibilityEvent.getPackageName() != null) { showToast("App "+accessibilityEvent.getPackageName()+" window state changed"); } break; } }

Ответ 2



По хорошему это не очень то и возможно, правда есть определенные хаки, с помощью которых можно отловить событие запуска приложения. В частности, в момент запуска приложения ОС выставляет логи, примерно следующего содержания: 05-17 13:55:30.586: I/ActivityManager(526): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.rovio.angrybirds/com.rovio.fusion.App} from pid 818 То есть вам надо ловить в логах запуск Intent'а android.intent.action.MAIN и извлечь пакет (как в данном случае com.rovio.angrybirds) Для того, чтобы читать логи вам нужно иметь пермишен и в сервисе читать логи LogCat: Process logcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"}); reader = new BufferedReader(new InputStreamReader(logcatProc.getInputStream())); Дальше уже парсить полученный StreamReader Как только вы отловите название стартовавшего пакета, то по имени пакета получить имя проги уже совсем просто: final String packageName = "my.application.package" PackageManager packageManager= getApplicationContext().getPackageManager(); String appName = (String) packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA));

Ответ 3



Нужно переопределить метод finish(), и в нем вызывать Toast и вызывать finish() суперкласса. Либо в методе onFinish вывести Toast.

Комментариев нет:

Отправить комментарий