2011-11-08 4 views
1

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

private class MyReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (working == true) { 
      //toast to make sure we got here 
      doWork(); 
     } 
    } 
} 

Тост в пределах if, вызываемый, но doWork не выполняется. Кто-нибудь имел дело с подобной проблемой?

ответ

2

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

От: http://developer.android.com/reference/android/content/BroadcastReceiver.html

объект А BroadcastReceiver действителен только на время вызова OnReceive (Context, Intent). Как только ваш код вернется из этой функции, система считает объект законченным и больше не активным.

Это имеет важные последствия для того, что вы можете сделать в реализации onReceive (Context, Intent): все, что требует асинхронной операции, недоступно, потому что вам нужно будет вернуться из функции для обработки асинхронной операции, но при этом point BroadcastReceiver больше не активен, и, таким образом, система может убить свой процесс до завершения асинхронной операции.

В частности, вы не можете отображать диалог или привязываться к службе из BroadcastReceiver. Для первого вам следует использовать API NotificationManager. Для последнего вы можете использовать Context.startService() для отправки команды службе.

+0

Спасибо за информацию. Я буду возиться с этим сегодня вечером. – Brianide

+0

У вас есть простой пример того, как запустить службу из BroadcastReceiver? Я все еще пытаюсь понять, как это работает. – Brianide

+0

У меня все получилось. Сервис - это то, что мне нужно. Благодаря! – Brianide

1

Скорее всего, он не просыпается достаточно долго. Вы используете WakeLock, чтобы Android не возвращался спать?

Итак, во-первых, вам нужно, чтобы добавить это манифеста:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

, а затем в ресивере // псевдокод для частей, которые имеют значение, кроме ...

public WakeLock wl; 
    @Override 
    public void onReceive(c,i){ 
     wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);//this matters 
     wl.getWakeLock().acquire(); //as does this 


     //do whatever but DON'T do it here... call a Service like this... 
     Intent i = new Intent(context, MyExcellentService.class); 

     try { 
    PendingIntent.getService(context, 0,i, 0).send(); 
     }catch(Exception e){} 

     //hold on to wl in some way and release it in the service, not here, 
     wl.getWakeLock().release(); 


    } 

Если вы собираетесь использовать услугу, вам необходимо зарегистрировать ее в своем манифесте, как это ...

<service android:name="MyExcellentService" /> 

И я бы расширьте приложение и держитесь там, где есть WakeLock, чтобы вам не пришлось проходить его более запутанно. Вы можете просто зайти в приложение и поговорить прямо с ним!

Вы хотите посмотреть разницу в * видах пробуждения PARTIAL_WAKE_LOCK не будет бодрствовать на экране, например, только фоновая обработка.

Сообщите мне, если это работает, я вырезаю и вставляю из разных мест, поэтому я могу что-то игнорировать.

+0

Я даже не знал, что это была проблема. Раньше я не смотрел на WakeLock. Проще реализовать? – Brianide

+0

чрезвычайно ... всего в секунду, я приведу вам пример кода ... –

+0

Спасибо, чувак. Я схожу с ума. – Brianide

Смежные вопросы