Ошибка При Получении Широковещательного намерения Проблема
-
19-09-2019 - |
Вопрос
Я создал широковещательный приемник в основном действии и фоновую службу, которая отправляет широковещательные намерения.Приложение выходит из строя каждый раз, когда я пытаюсь его запустить, и в журнале отображается следующее сообщение об ошибке:
10-04 13:30:43.218:ОШИБКА / AndroidRuntime (695):java.lang.RuntimeException Исключение:Ошибка получение широковещательного намерения { действие=com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (имеет дополнительные возможности) } в com.client.gaitlink.GaitLink$LoginStatusReceiver@431690e8
Широковещательное сообщение отправляется из класса 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>
Я был бы очень признателен, если бы кто-нибудь мог объяснить, почему в журнале отображается приведенное выше сообщение и приложение выходит из строя.
Спасибо!
Решение
Выполнили ли вы шаг за шагом в отладчике, чтобы точно определить, где происходит сбой?
На что следует обратить внимание, так это на то, что если вы переопределяете какие-либо события жизненного цикла Android, то при необходимости вы правильно вызываете конструктор базового класса.
Другие советы
Я решил эту проблему, добавив intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
когда вы начинаете новую activity
.
Если не начато с activity
, intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
необходим.
У вас есть два Intent
Фильтры;вам нужен только один.Если вы зарегистрируете BroadcastReceiver
через registerReceiver()
, используйте только IntentFilter
это второй параметр для этого вызова API - не ставьте также <intent-filter>
элемент в <activity>
в манифесте.
Я не знаю наверняка, является ли это вашей проблемой, но это определенно не помогает.
Я не уверен, что вы сможете понять, что я хочу сказать, из-за моего английского.
Я думаю, что эта строка кода является причиной проблемы:
userInfo.setSessionString(sessionString);
Мой проект был неправильным, потому что я хочу:
int i = Integer.parseint(intent.getExtars("9"));
и вы регистрируетесь два раза.
я думаю, вы должны использовать метод жизненного цикла onPause()
и onResume()
Метод отмены регистрации и регистрации широковещательного намерения.
Я обнаружил, что, убедившись, что намерение было запущено из исходного действия, и поместив вещи в один класс, мы полностью избавились от проблемы.
Это очень старый вопрос, но я думаю, что многие люди все еще искали бы ответы на него.Моя ситуация очень похожа на эту.
Что я хотел сделать, так это вызвать finish() в дочернем действии, когда в родительском действии происходят определенные события, т.е.отправляя широковещательное сообщение из MainActivity в Дочернюю 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);
В рамках дочернего класса activity:
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
}
}
};
Надеюсь, это поможет.
Хорошо, что сработало для меня, так это объявление onNotification
способ заключается в следующем:
window.onNotification = function(event) {
alert('onNotification called!');
};