2010-08-11 2 views
1

J'ai un BroadcastReceiver qui fonctionne très bien, à savoir l'exécution de ce code d'une activité, le récepteur reçoit l'intention:Android: Receive diffusion personnalisée quand un bouton dans un widget est cliqué

Intent toggleIntent = new Intent(this, ToggleServicesReceiver.class); 
this.sendBroadcast(toggleIntent); 

Mais je suis en train de faire la même chose à partir d'un bouton dans un Widget:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    ... 
    Intent toggleIntent = new Intent(context, ToggleServicesReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, toggleIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    remoteView.setOnClickPendingIntent(R.id.widget_button, pendingIntent); 
} 

le code est appelé (je l'ai vérifié avec le débogueur), mais lorsque l'utilisateur clique sur le bouton, le même BroadcastReceiver ne reçoit pas le Intent.

Que pourrait-il se passer?

Modifier: Le BroadcastReceiver est défini dans AndroidManifest.xml, et maintenant je ne sais pas si le <intent-filter> est nécessaire:

<receiver android:name="foo.receivers.ToggleServicesReceiver"> 
    <intent-filter> 
     <action android:name="foo.intent.action.SERVICES_TOGGLE" /> 
    </intent-filter> 
</receiver> 

Modifier: Je l'ai aussi trouvé cela dans un forum, il pourrait être liée à ce problème

Vous ne pouvez simplement pas faire cela. Un composant BroadcastReceiver uniquement "dure" pendant la durée de l'appel à onReceiveIntent(); il n'est pas autorisé à utiliser registerReceiver en elle, car au moment où vous revenez de cette méthode (à quel point vous pourriez d'abord recevoir quoi que ce soit de votre registre), le composant n'est plus vivant, et le système pourrait tuer à à tout moment pour récupérer la mémoire.

+0

Il semble que bon. Où est ce '' BroadcastReceiver' déclaré - manifeste ou 'registerReceiver()'? Si ce dernier, êtes-vous sûr qu'il est réellement enregistré au moment du clic sur le widget de l'application? – CommonsWare

+0

Il est déclaré dans le manifeste, mais je l'ai essayé dans les deux sens. Je vais répéter mes tests, juste au cas où je manquerais quelque chose. J'ai également trouvé une question proche dans SO avec le même problème (http://stackoverflow.com/questions/3044275/send-a-public-broadcast-from-an-appwidget-in-android) –

Répondre

0

Considérez ceci:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, toggleIntent, PendingIntent.FLAG_ONE_SHOT); 
Questions connexes