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