Всем привет из далёких уголков нашей любимой и необъятной страны. Сегодня мы поговорим о мониторинге приложений. Это важный урок, который позволит отслеживать приложения и считать статистику запусков. Для начала нужно понять что такое приложение и как оно работает.
Нудная теория
Любое приложение делится на две части:
- Background — сервисы и тому подобное.
- Activity — то что показывается юзеру.
У приложения может быть много Activity, одни могут быть доступны из меню приложений андроида, а другие вызываются через код. Каждое activity имеет свое имя и структуру. К примеру, у нас есть приложение «com.microsoft.hack» (это имя для package) и есть activity «startpage«, тогда полное название данной activity будет «com.microsoft.hack.startpage«. Названия могут быть вложенными, это определяется структурой папок и расположением «.java» файлов.
Подготовка к слежению
Что нам потребуется?
- Создать процесс (сервис к примеру), который будет раз в N секунд запрашивать ActivityManager и проверять какое приложение наверху.
- Выполнять любые действия, принимая во внимания эту информацию.
Для начала идем в Manifest, запрашиваем права, для работы с ActivityManager:
1 |
<uses-permission android:name="android.permission.GET_TASKS" /> |
и регистрируем сервис:
1 |
<service android:name=".Monitor" /> |
Создаем наш сервис, где будем вести обработку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Monitor extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_STICKY; } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException(""); } @Override public void onCreate() { MyTimerTask myTask = new MyTimerTask(); Timer myTimer = new Timer(); myTimer.schedule(myTask, 0, 1000); } class MyTimerTask extends TimerTask { public void run() { // выполнение кода анализа процессов. } } } |
Запуск в первой activity, которая стартует при запуске приложения:
1 |
context.startService(new Intent(context, Monitor.class)); |
Переходим к обработке:
1 2 3 4 |
ActivityManager am = (ActivityManager) Context.getSystemService(cnt.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); app = taskInfo.get(0).topActivity.getClassName(); //*log place |
После чего в app лежит та самая строка с activity.
Важный момент: мы можем ставить обработку как на всё приложение, так и на отдельные его окошки.
Как я узнаю какие существуют названия и как их посмотреть?
Это очень просто, заместо «//*log place» пишем код:
1 |
Log.w("log",app); |
и увидим в logcat логи всех переключаемых приложений.
Как мне вставить свою обработку?
Нужно написать после получения переменной app:
1 2 3 |
if(app.equals("name_activity"){ // делаем действия } |
Всегда приходит конец
Вот и материал пришел к логическому концу. Это хорошая база для написание инжектов, обработки действий для запущенных приложений, сбора статистики и всего что может прийти Вам в голову.
Спасибо за внимание =)
Помочь ретвитом можно здесь!
когда перехват 4.4+ будет статья?