web-dev-qa-db-fra.com

Erreur de réception du problème d'intention de diffusion

J'ai créé un récepteur de diffusion dans l'activité principale et le service en arrière-plan qui envoie des intentions de diffusion. L'application se bloque chaque fois que j'essaie de l'exécuter et le journal affiche le message d'erreur suivant:

10-04 13: 30: 43.218: ERREUR/AndroidRuntime (695): Java.lang.RuntimeException: Erreur Lors de la réception de la diffusion Intent { Action = com .client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (a des extras)} dans com.client.gaitlink.GaitLink$LoginStatusReceiver@431690e8

Le message à diffuser est envoyé à partir de la classe CommunicationService selon la méthode suivante:

private void announceLoginStatus(){
    Intent intent = new Intent(LOGIN_STATUS_UPDATE);
    intent.putExtra(SERVER_MESSAGE, mServerResponseMessage);
    intent.putExtra(SESSION_STRING, mSessionString);
    sendBroadcast(intent);
}

où 

String LOGIN_STATUS_UPDATE = "com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE"

dans l'activité principale, le récepteur de diffusion suivant est défini:

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();
        }
    }

et enregistré dans la méthode onResume:

        IntentFilter loginStatusFilter;
        loginStatusFilter = new IntentFilter(CommunicationService.LOGIN_STATUS_UPDATE);
        loginStatusReceiver = new LoginStatusReceiver();
        registerReceiver(loginStatusReceiver, loginStatusFilter);

Et le fichier manifeste comprend les éléments suivants:

<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>

J'apprécierais vraiment si quelqu'un pouvait expliquer pourquoi le journal affiche le message ci-dessus et que l'application se bloque.

Merci!

15
Niko Gamulin

Êtes-vous allé pas à pas dans le débogueur pour trouver exactement où se produisait le crash?

Si vous redéfinissez l'un des événements de cycle de vie Android, vous appelez correctement le constructeur de la classe de base lorsque cela est nécessaire.

4
JRL

Je l'ai résolu en ajoutant intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); lorsque vous démarrez une nouvelle activity

S'il n'est pas démarré à partir d'une activity, intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); est nécessaire.

9
shencp

Vous avez deux filtres Intent; vous n'avez besoin que d'un seul. Si vous enregistrez la BroadcastReceiver via registerReceiver(), utilisez uniquement la IntentFilter qui est le deuxième paramètre de cet appel d'API - ne mettez pas également un élément <intent-filter> dans le <activity> du manifeste.

Je ne sais pas avec certitude si tel est votre problème, mais cela n’aide en rien.

6
CommonsWare

C'est une très vieille question, mais je pense que beaucoup de gens chercheraient toujours des réponses. Ma situation est assez similaire à celle-ci. 

Ce que je voulais faire, c’est d’appeler finish () dans l’activité enfant lorsque certains événements se produisent dans l’activité parent, c’est-à-dire en envoyant le message diffusé de MainActivity à l’activité enfant.

Voici le code dans MainActivity lorsque l'événement est survenu (par exemple, lorsque la connexion réseau est interrompue, etc.):

    Intent intent = new Intent("ACTIVITY_FINISH");
    intent.putExtra("FinishMsg","ACTIVITY_FINISH: Network broken.");
    sendBroadcast(intent);

Dans la fonction OnResume () de l'activité enfant:

    IntentFilter quitFilter = new IntentFilter();
    quitFilter.addAction("ACTIVITY_FINISH");
    registerReceiver(m_quitReceiver, quitFilter);

Dans la fonction OnPause () de l'activité enfant:

    unregisterReceiver(m_quitReceiver);

Dans la classe d'activité enfant:

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
        }
    }
};

J'espère que cela t'aides.

0
aquadeep

Je ne suis pas sûr que vous puissiez comprendre ce que je veux dire, à cause de mon anglais.

Je pense que cette ligne de code est la cause d'un problème:

userInfo.setSessionString(sessionString); 

Mon projet était faux parce que je voulais: 

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

et vous vous enregistrez deux fois.

0
zhuizhu

J'ai constaté que le fait de s'assurer que l'intention était conforme à l'activité initiale et de regrouper les éléments dans une classe permettait d'éliminer toute la question.

0
msj121

je pense que vous devez utiliser la méthode du cycle de vie onPause() et onResume(), méthode pour annuler l'enregistrement et enregistrer l'intention de diffusion.

0
user1008590