java - sound - using notification android




Notifiche che si aprono da sole (2)

Il servizio viene eseguito quando lo si registra, quindi ciò che è necessario fare è passare un valore booleano con l'intento quando si registra il servizio per impedirne l'esecuzione durante l'esecuzione dell'applicazione, ma per eseguirlo periodicamente successivamente.

Nella tua attività aggiungi:

intent.putExtra("run", false);

Quindi in MyAlarmService:

private boolean run = true;
// ...
action.getBooleanExtra("run", run);
if(run) {
    // notifications code
} else {
    run = true;
}

le notifiche della mia app si aprono senza un senso logico del codice che ho scritto. Dovrei ricevere una notifica ogni giorno alla stessa ora, ma se apro l'app ricevo la stessa notifica. Questo è il codice in MainActivity:

public void setRepeatingAlarm() {
         Intent intent = new Intent(this, MyAlarmService.class);
         PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
         intent, PendingIntent.FLAG_CANCEL_CURRENT);
         Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, 13);
            calendar.set(Calendar.MINUTE, 00);
            calendar.set(Calendar.SECOND, 00);

         am.setRepeating(AlarmManager.RTC_WAKEUP,  calendar.getTimeInMillis(),24*60*60*1000,pendingIntent);
}

E questo è MyAlarmService:

public class MyAlarmService extends BroadcastReceiver {

 NotificationManager nm;

 @Override
 public void onReceive(Context context, Intent intent) {
  nm = (NotificationManager) context
    .getSystemService(Context.NOTIFICATION_SERVICE);
  CharSequence from = "Locali Torino";
  CharSequence message = "Visita le serate!";
  Intent action = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
    action, 0);



  Notification notif = new Notification(R.drawable.disco,
    "Visita le serate!", System.currentTimeMillis());
  notif.setLatestEventInfo(context, from, message, contentIntent);
  notif.flags |= Notification.FLAG_AUTO_CANCEL;
  nm.notify(0, notif);  

 }
}

Perché ricevo notifiche quando apro l'app o almeno non solo al momento impostato?

MODIFICARE

MyAlarmService:

public class MyAlarmService extends BroadcastReceiver {

 NotificationManager nm;

 @Override
 public void onReceive(Context context, Intent intent) {


  nm = (NotificationManager) context
    .getSystemService(Context.NOTIFICATION_SERVICE);
  CharSequence from = "Locali Torino";
  CharSequence message = "Visita le serate!";
  Intent action = new Intent(context, MainActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
    action, 0);



  Notification notif = new Notification(R.drawable.disco,
    "Visita le serate!", System.currentTimeMillis());
  notif.setLatestEventInfo(context, from, message, contentIntent);
  notif.flags |= Notification.FLAG_AUTO_CANCEL;
  nm.notify(0, notif);  
  SharedPreferences mPref = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
    SharedPreferences.Editor mEditor = mPref.edit();



    long time = System.currentTimeMillis();
    mEditor.putLong("UPDATE_TIME", time);
    mEditor.commit();
 }And this is MainActivity:

public void setRepeatingAlarm() {
         Intent intent = new Intent(this, MyAlarmService.class);


         PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
         intent, PendingIntent.FLAG_CANCEL_CURRENT);

         long startAt;
         long period;

         SharedPreferences mPref = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);

         long dif = System.currentTimeMillis() - mPref.getLong("UPDATE_TIME", 0);

         if (dif >= UPDATE_PERIOD) {
           startAt = 0;
           period = UPDATE_PERIOD;
         } else {
           startAt = dif;
           period = dif;
         }


         am.setRepeating(AlarmManager.RTC_WAKEUP, startAt, period,pendingIntent);
}

In realtà funziona esattamente come il codice è scritto. La causa di tale comportamento è il parametro setRepeating nel metodo setRepeating .

 am.setRepeating(AlarmManager.RTC_WAKEUP,
                 calendar.getTimeInMillis(),
                 24*60*60*1000,
                 pendingIntent);

calendar.getTimeInMillis() tempo in millisecondi che l'allarme dovrebbe prima disattivare, utilizzando l'orologio appropriato (a seconda del tipo di allarme).

Per esempio :

//send first alarm after 1 second and repeat it every 24 hours
am.setRepeating(AlarmManager.RTC_WAKEUP,
                 1000,
                 24*60*60*1000,
                 pendingIntent);

//send first alarm after 10 second and repeat it every 24 hours
am.setRepeating(AlarmManager.RTC_WAKEUP,
                 10000,
                 24*60*60*1000,
                 pendingIntent);

AGGIORNARE :

Devi salvare il tuo ultimo tempo di aggiornamento:

public class MyAlarmService extends BroadcastReceiver {

 NotificationManager nm;

 @Override
 public void onReceive(Context context, Intent intent) {
  //send alarm here
  //...

    SharedPreferences mPref = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
    SharedPreferences.Editor mEditor = mPref.edit();
    mEditor.putLong("UPDATE_TIME", time);
    mEditor.commit();
 }
}

Quindi puoi setRepeatingAlarm metodo setRepeatingAlarm questo modo:

public void setRepeatingAlarm() {
         Intent intent = new Intent(this, MyAlarmService.class);
         PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
         intent, PendingIntent.FLAG_CANCEL_CURRENT);

         long startAt;
         long period;

         SharedPreferences mPref = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);

         long dif = System.currentTimeMillis() - mPref.getLong("UPDATE_TIME", 0);

         if (dif >= UPDATE_PERIOD) {
           startAt = 0;
           period = UPDATE_PERIOD;
         } else {
           startAt = dif;
           period = dif;
         }

         am.setRepeating(
               AlarmManager.RTC_WAKEUP,
               startAt,
               period,
               pendingIntent);
}