[Android] AlarmManager

a marqué ce sujet comme résolu.

Salut, j’essaye d’utiliser correctement un AlarmManager, mais plus je lis, moins je comprends.

Voilà ce que je veux faire : j’ai une Activity avec un String que j’aimerai afficher toutes les heures. Voici mon code pour l’instant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected void onCreate(Bundle savedInstanceState) {
        [...]
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 12); //midi

        Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class);
        alarmIntent.putExtra("message", msg);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
        AlarmManager am =(AlarmManager) getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 1000*20, pendingIntent); //répéter toutes les 20 secondes
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        String msg= "";
        Bundle extras = intent.getExtras();
        if (extras != null) {
            msg= extras.getString("message");
        }
        System.out.println("Message= " + msg);
    }
}

Comment je devrais m’y prendre ?

+0 -0

Ok, j’avais simplement oublié d’enregistrer l’AlarmReceiver dans le Manifest.

Maintenant, j’ai un nouveau problème. J’aimerai exécuter une méthode de mon Activity toutes les heures.

Voici le nouveau code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
  private void setAlarm() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 12); // midi

        mAlarmReceiver = new AlarmReceiver();
        mAlarmReceiver.setMainActivityHandler(this);
        IntentFilter intentFilter = new IntentFilter("android.intent.action.ANY_ACTION");
        registerReceiver(mAlarmReceiver, intentFilter);

        Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
        AlarmManager am =(AlarmManager) getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 1000 * 10, pendingIntent); // toutes les 10 secondes
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class AlarmReceiver extends BroadcastReceiver {
    MainActivity mMainActivity = null;

    public void setMainActivityHandler(MainActivity main) {
        mMainActivity = main;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
         mMainActivity.method();
    }
}

J’ai une magnifique NPE:java.lang.RuntimeException: Unable to start receiver app.Controller.AlarmReceiver: java.lang.NullPointerException

mMainActivity est nul quand j’appelle ma méthode dessus.

Merci d’avance pour votre aide.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte