#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.
Комментариев нет:
Отправить комментарий