web-dev-qa-db-fra.com

Comment utiliser la méthode registerReceiver?

Je veux utiliser BroadcastReceiver enregistré dynamiquement qui a une référence à un Activity afin qu'il puisse modifier son interface utilisateur. J'utilise la méthode Context.registerReceiver() mais la méthode onReceive() du récepteur n'est jamais appelée.

Voici l'exemple de code illustrant le problème:

package com.example;

import Android.app.Activity;
import Android.app.IntentService;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.KeyEvent;

public class RegisterBroadcastReceiver extends Activity {

    public static class MyIntentService extends IntentService {

        public MyIntentService() {
            super(MyIntentService.class.getSimpleName());
        }

        @Override
        protected void onHandleIntent(Intent intent) {
            Intent i = new Intent(this, MyBroadcastReceiver.class);
            sendBroadcast(i);
        }
    }

    public class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(MyBroadcastReceiver.class.getSimpleName(),
                  "received broadcast");
        }

    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    MyBroadcastReceiver mReceiver = new MyBroadcastReceiver();

    @Override
    protected void onResume() {
        super.onResume();

        IntentFilter intentFilter = new IntentFilter();
        registerReceiver(mReceiver, intentFilter);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            Intent i = new Intent(this, MyIntentService.class);
            startService(i);
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }

}
45
Urboss

Le code entier si quelqu'un en a besoin.

void alarm(Context context, Calendar calendar) {
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(ALARM_SERVICE);

    final String SOME_ACTION = "com.Android.mytabs.MytabsActivity.AlarmReceiver";
    IntentFilter intentFilter = new IntentFilter(SOME_ACTION);

    AlarmReceiver mReceiver = new AlarmReceiver();
    context.registerReceiver(mReceiver, intentFilter);

    Intent anotherIntent = new Intent(SOME_ACTION);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, anotherIntent, 0);
    alramManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

    Toast.makeText(context, "Added", Toast.LENGTH_LONG).show();
}

class AlarmReceiver extends BroadcastReceiver {     
    @Override
    public void onReceive(Context context, Intent arg1) {
        Toast.makeText(context, "Started", Toast.LENGTH_LONG).show();
    }
}
39
Mike

Les récepteurs de diffusion reçoivent des événements d'un certain type. Je ne pense pas que vous puissiez les invoquer par nom de classe.

Tout d'abord, votre IntentFilter doit contenir un événement.

static final String SOME_ACTION = "com.yourcompany.yourapp.SOME_ACTION";
IntentFilter intentFilter = new IntentFilter(SOME_ACTION);

Deuxièmement, lorsque vous envoyez une diffusion, utilisez cette même action:

Intent i = new Intent(SOME_ACTION);
sendBroadcast(i);

Troisièmement, avez-vous vraiment besoin que MyIntentService soit en ligne? Statique? [EDIT] J'ai découvert que MyIntentSerivce DOIT être statique s'il est en ligne.

Quatrièmement, votre service est-il déclaré dans le fichier AndroidManifest.xml?

16
Emmanuel