Поиск по блогу

21 мая 2011 г.

Отлов события: Запуск приложения Android


На поиск решения у меня ушло много часов. Где-то за 6 или 7 часов я облазил весь инет, загуглил множество сайтов, форумов, просмотрел более 400 тем anddev.org. Такое количество поисковых фраз придумал =)

Проблема в том, что Андроид не оповещает нас о том, когда пользователь запускает какое-либо приложение. Он нас может оповестить об установке пакета, об удалении, о его закрытии, но не о его запуске. Ответ был найден здесь.

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

<code>
Process proc = null;

try {
proc = Runtime.getRuntime().exec("/system/bin/logcat -b main");
} catch(IOException e) {
// work exception
}

BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(
proc.getInputStream()
));

String line;

while ( true ) {
line = reader.readLine();
}
</code>

Сообщение о запуске приложения обычно представлено в логе записью типа:
02-15 21:56:43.192: INFO/ActivityManager(52): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=org.uas.uprotector/.LogActivity }

Для обработки сообщения и выделения имени запускаемого приложения (activity) можно воспользоваться регулярными выражениями.

Как мы видим – решение такое задачи крайне нетривиально и требовательно к ресурсам. Надеюсь, что в будущих платформах Андроид все-таки будет об этом оповещать через broadcast сообщения, которые можно отловить reciever-классами.

Кстати, для чтения логов не забудьте в манифест добавить строчку:
<uses-permission android:name="android.permission.READ_LOGS" />

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

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