it-roy-ru.com

Ошибка при получении сообщения о намерениях

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

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"

в основной деятельности определен следующий вещатель:

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>

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

Спасибо!

15
Niko Gamulin

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

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

4
JRL

Я решил это, добавив intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); при запуске новой activity

Если не запускается с activity, необходима intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);.

9
shencp

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

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

6
CommonsWare

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

То, что я хотел сделать, это вызвать метод 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
        }
    }
};

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

0
aquadeep

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

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

userInfo.setSessionString(sessionString); 

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

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

и вы регистрируетесь два раза.

0
zhuizhu

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

0
msj121

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

0
user1008590