Ошибка при получении сообщения о намерениях - PullRequest
17 голосов
/ 04 октября 2009

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

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>

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

Спасибо!

Ответы [ 8 ]

9 голосов
/ 27 декабря 2010

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

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

6 голосов
/ 04 октября 2009

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

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

4 голосов
/ 04 октября 2009

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

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

0 голосов
/ 10 марта 2016

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

То, что я хотел сделать, это вызвать метод 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 голосов
/ 07 августа 2015

Хорошо, у меня получилось объявить метод onNotification следующим образом:

    window.onNotification = function(event) {
    alert('onNotification called!');
};
0 голосов
/ 13 января 2014

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

0 голосов
/ 03 августа 2012

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

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

userInfo.setSessionString(sessionString); 

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

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

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

0 голосов
/ 05 июня 2012

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

...