2016-10-20 8 views
1

Я сделал broadcasereceiver с 4 умысел фильтромпроизводительность Android BroadcaseReceiver (слишком медленно и не точно)

  • Intent.ACTION_SCREEN_OFF
  • Intent.ACTION_SCREEN_ON
  • Intent.ACTION_USER_PRESENT
  • Intent.ACTION_BOOT_COMPLETED

Это работает !!! Каждый раз, когда я получал сообщение с сообщением 4, Я могу найти сообщение Log, которое работает !!!

 @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO: This method is called when the BroadcastReceiver is receiving 
     // an Intent broadcast. 

     switch (intent.getAction()) { 
      case Intent.ACTION_SCREEN_ON: 
       Log.d("mypackage", "ACTION_SCREEN_ON"); 
       break; 
      case Intent.ACTION_SCREEN_OFF: 
       Log.d("mypackage", "ACTION_SCREEN_OFF"); 
       break; 
      case Intent.ACTION_BOOT_COMPLETED: 
       Log.d("mypackage", "ACTION_BOOT_COMPLETED"); 
       break; 
      case Intent.ACTION_USER_PRESENT: 
       Log.d("mypackage", "ACTION_USER_PRESENT"); 
       break; 
     } 

    } 

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

связано ли это с моей реализацией кода? или просто низкая производительность Android? plz help me ~

ответ

0

Главным образом это система. Пила различные времена приема для одного и того же намерения на разных устройствах. Это раздражает, но вы ничего не можете с этим поделать.

«Даже в случае обычных передач, система может в некоторых ситуации вернуться к доставке широковещательной передачи одного приемника одновременно. В частности, для приемников, которые могут потребовать создания процесса, только один из них будет запускаться одновременно, чтобы избежать перегрузки системы новыми процессами. Однако в этой ситуации выполняется некорректная семантика : эти приемники по-прежнему не могут вернуть результаты или прервать свою трансляцию ».

https://developer.android.com/reference/android/content/BroadcastReceiver.html

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/14043456) – SiHa

+0

Обновлен ответ. – Alex

0

Это действительно зависит от состояния приложения во время выполнения вещания и версии Android OS, где выполняется приложение.

Помните, что в потоке пользовательского интерфейса выполняется BroadcastReceiver. Если приложение выполняет тяжелую задачу одновременно, вы пытаетесь обработать свое событие в приемнике, это будет медленным процессом. Вы увидите, как событие не доходит до вашего приемника до тех пор, пока петлитель потока пользовательского интерфейса не будет работать или как ваш пользовательский интерфейс не будет заморожен до тех пор, пока ваш приемник не обработает событие.

Я бы рекомендовал вам просмотреть, если вы одновременно передаете событие получателю, приложение выполняет что-то в потоке пользовательского интерфейса.

Чтобы отслеживать мое приложение на разных устройствах и версиях ОС Android, я использую инструмент, который я разрабатываю http://flowup.io с помощью этого инструмента. Я могу контролировать частоту кадров, которая у меня есть в моем приложении. В идеале, мы должны иметь 60 кадров в секунду, но это не всегда возможно :). Вот вам пример моей работы приложения, основанного на различных устройствах и различных версиях Android OS:

enter image description here

Как вы можете видеть, в какой-то момент кадров являются довольно низкими. Это потому, что у меня была ошибка в службе, сортирующей список из 1000 элементов в потоке пользовательского интерфейса xD.

Я бы рекомендовал вам следить за своим приложением и проверять, связана ли ваша проблема напрямую с получателем или остальной частью приложения, выполняющим код в потоке пользовательского интерфейса, когда это должно быть вне потока пользовательского интерфейса. Поскольку этот инструмент все еще находится в разработке, вы можете использовать другие уже выпущенные инструменты: traeview, systrace или монитор производительности Android Studio. Вы можете подписаться на список рассылки, чтобы знать, когда будет опубликован первый выпуск.

Если вам по-прежнему нужно отправить мероприятие, вы можете использовать другие альтернативы как otto или busevent для замены использования широковещательной передачи. Эти библиотеки могут использоваться, если отправленное вами событие не зависит от жизненного цикла приложения.