Ошибка При Получении Широковещательного намерения Проблема

StackOverflow https://stackoverflow.com/questions/1516211

Вопрос

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

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!');
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top