2009-10-04 4 views
14

Я создал широковещательный приемник в основном действии и фоновом сервисе, который отправляет трансляции. Приложение падает каждый раз, когда я пытаюсь запустить его, и Log появляется следующее сообщение об ошибке:Ошибка при получении запроса на широковещательный вызов

10-04 13: 30: 43.218: ERROR/AndroidRuntime (695): java.lang.RuntimeException: Ошибка приема вещания Намерение { действие = com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (имеет дополнительные услуги)} в [email protected]

сообщение широковещательной передачи посылается из Класс CommunicationService следующим способом:

private void announceLoginStatus(){ 
    Intent intent = new Intent(LOGIN_STATUS_UPDATE); 
    intent.putExtra(SERVER_MESSAGE, mServerResponseMessage); 
    intent.putExtra(SESSION_STRING, mSessionString); 
    sendBroadcast(intent); 
} 

где

String LOGIN_STATUS_UPDATE = "com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" 

в основной деятельности следующих широковещательный Reveiver определяется:

public class LoginStatusReceiver extends BroadcastReceiver { 

     public void onReceive(Context context, Intent intent) { 
      String serverMessage = intent.getStringExtra(CommunicationService.SERVER_MESSAGE); 
      String sessionString = intent.getStringExtra(CommunicationService.SESSION_STRING); 

      userInfo.setSessionString(sessionString); 
      saveSettings(); 
     } 
    } 

и зарегистрирован в методе onResume:

 IntentFilter loginStatusFilter; 
     loginStatusFilter = new IntentFilter(CommunicationService.LOGIN_STATUS_UPDATE); 
     loginStatusReceiver = new LoginStatusReceiver(); 
     registerReceiver(loginStatusReceiver, loginStatusFilter); 

И файл манифеста я ncludes следующее:

<activity android:name=".GaitLink" 
       android:label="@string/app_name"> 
     <intent-filter> 
      ... 
      <action android:name="com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" /> 
     </intent-filter> 
    </activity> 

Я был бы очень признателен, если кто-нибудь может объяснить, почему Log отображает сообщение выше и сбои приложений.

Спасибо!

ответ

5

Вы пошли шаг за шагом в отладчик, чтобы найти, где именно происходит авария?

Следует обратить внимание на то, что вы переопределяете любые события жизненного цикла Android, которые должным образом вызывают конструктор базового класса, когда это необходимо.

+58

Возможно, вы могли бы рассказать нам, в чем проблема? – Buffalo

4

У вас есть два фильтра Intent; вам нужен только один. Если вы зарегистрируете BroadcastReceiver по адресу registerReceiver(), используйте только IntentFilter, что является вторым параметром для этого вызова API. Не помещайте в манифест <intent-filter> элемент в <activity>.

Я не знаю наверняка, если это ваша проблема, но это, конечно же, не помогает.

7

Я решил это, добавив intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);, когда вы начнете новое мероприятие.

Если не начато действие, необходимо указать intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK".

+0

это работает для меня! –

0

Я думаю, вы должны использовать метод жизненного цикла onPause() и onResume() Метод для регистрации и регистрации трансляции.

0

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

Я думаю, что эта строка кода является причиной проблемы:

userInfo.setSessionString(sessionString); 

Мой проект был неправ, потому что я хочу:

int i = Integer.parseint(intent.getExtars("9")); 

и регистрации в два раза.

0

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

-1

Хорошо, что сработало для меня было объявить метод onNotification следующим образом:

window.onNotification = function(event) { 
    alert('onNotification called!'); 
}; 
0

Это очень старый вопрос, но я думаю, что многие люди по-прежнему будут искать ответы на него. Моя ситуация очень похожа на эту.

Что я хотел сделать, это вызов функции finish() в дочернем действии, когда определенные события происходят в родительской активности, то есть путем отправки широковещательного сообщения из MainActivity в Child Activity.

Ниже приводится код в MainActivity, когда произошло событие (например, когда сетевое соединение разорвано и т.д. и т.п.):

Intent intent = new Intent("ACTIVITY_FINISH"); 
    intent.putExtra("FinishMsg","ACTIVITY_FINISH: Network broken."); 
    sendBroadcast(intent); 

В OnResume ребенка Занятия() функции:

IntentFilter quitFilter = new IntentFilter(); 
    quitFilter.addAction("ACTIVITY_FINISH"); 
    registerReceiver(m_quitReceiver, quitFilter); 

В функция OnPause() детской активности:

unregisterReceiver(m_quitReceiver); 

В рамках дочерней деятельности cl задница:

BroadcastReceiver m_quitReceiver = new BroadcastReceiver() 
{ 
    public void onReceive(Context context, final Intent intent) 
    { 
     if (intent.getAction().equalsIgnoreCase("ACTIVITY_FINISH")) 
     { 
      Log.d("INFO", intent.getExtras().getString("FinishMsg")); 
      finish(); // do here whatever you want 
     } 
    } 
}; 

Надеюсь, это поможет.

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