Ошибка при получении проблемы с трансляцией
Я создал широковещательный приемник в основном действии и фоновом сервисе, который отправляет трансляции. При каждом запуске приложения приложение аварийно завершает работу, и в журнале отображается следующее сообщение об ошибке:
10-04 13: 30: 43.218: ОШИБКА /AndroidRuntime (695): java.lang.RuntimeException: Ошибка получение трансляции Intent { действие = 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"
в основной деятельности определяется следующий трансляционный речеватель:
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);
И файл манифеста включает в себя следующее:
<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>
Я был бы очень признателен, если бы кто-нибудь мог объяснить, почему в журнале отображается сообщение выше, и приложение вылетает.
Спасибо!
Ответы
Ответ 1
Вы пошагово шагнули в отладчике, чтобы найти, где именно происходит авария?
Одна вещь, на которую нужно обратить внимание, - это то, что вы переопределяете любые события жизненного цикла Android, которые при необходимости вызывают конструктор базового класса.
Ответ 2
Я решил это, добавив intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
при запуске нового действия.
Если не начато действие, требуется intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK"
.
Ответ 3
У вас есть два фильтра Intent
; вам нужен только один. Если вы зарегистрируете BroadcastReceiver
через registerReceiver()
, используйте только IntentFilter
, который является вторым параметром для этого вызова API, - также не помещайте элемент <intent-filter>
в <activity>
в манифесте.
Я не знаю наверняка, если это ваша проблема, но это, безусловно, не помогает.
Ответ 4
Я думаю, вам нужно использовать метод жизненного цикла onPause()
и onResume()
Метод для отмены регистрации и регистрации намерений трансляции.
Ответ 5
Я не уверен, что вы можете понять, что я хочу сказать, из-за моего английского.
Я думаю, что эта строка кода является причиной проблемы:
userInfo.setSessionString(sessionString);
Мой проект был неправильным, потому что я хочу:
int i = Integer.parseint(intent.getExtars("9"));
и вы регистрируете два раза.
Ответ 6
Я обнаружил, что, убедившись, что намерение было запущено из первоначальной активности, и помещать вещи в один класс, удалось избавиться от всей проблемы.
Ответ 7
Это очень старый вопрос, но я думаю, что многие люди будут искать ответы на него. Моя ситуация очень похожа на эту.
То, что я хотел сделать, заключается в вызове 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);
В классе дочерней активности:
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
}
}
};
Надеюсь, что это поможет.
Ответ 8
Хорошо, что сработало для меня, объявлял метод onNotification
следующим образом:
window.onNotification = function(event) {
alert('onNotification called!');
};