Ошибка при получении проблемы с трансляцией

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

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!');
};