среда, 19 февраля 2014 г.

Долгий анализ входящего смс

  В процессе улучшения работы анализа смс сообщения наткнулся на одну проблему в работе BroadcastReceiver'а: при долгом анализе сообщения в функции onReceive процесс прибивался и не получалось отфильтровать ненужное сообщение.
  На версии до 2.3.3 (API 10) на работу внутри onReceive выделялось больше времени, в версии 3.0 (API 11) время сократили, но появилась функция goAsync() возвращающая BroadcastReceiver.PendingResult, что позволяет делать тяжелую обработку в параллельном потоке и не нагружать главный. На работу в параллельном потоке дается 10 секунд, этого вполне достаточно. Следующий в очереди BroadcastReceiver не будет вызван до вызова BroadcastReceiver.PendingResult.finish(), так же есть функция BroadcastReceiver.PendingResult.abortBroadcast() чтоб прервать дальнейшую обработку события.

  Вариант с выносом обработки в Service для меня не подошел из-за невозможности вызвать другие обработчики смс. Для эмуляции прихода нового сообщения необходимо разрешение BROADCAST_SMS которое доступно только системным приложениям. Был вариант с имитацией получения смс, для этого нужно было показать уведомление и добавить во входящие (остальные изменения имитировать не получится), но по приведенной выше причине, а также из-за возможных проблем на версии 4.4, этот вариант не подошел.
  Ну и ссылка на приложение: SMS Spam Filter ))

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

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