1

我试图做一个药丸提醒。当我创建多个提醒时,我的应用程序显示所有通知,但仅在最后一次设置。它也执行多次OnReceive()方法,我不明白为什么。我发现许多问题都有相同的论点,我用这些答案改变了我的代码,但没有解决我的问题。谢谢!多个重复通知与报警管理器[安卓]

设备:Asus ZenPad S 8.0; Android:6.0.1;

这是我的代码:

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 

     case R.id.button: 
      mcurrentTime = Calendar.getInstance(); 
      int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY); 
      int minute = mcurrentTime.get(Calendar.MINUTE); 
      TimePickerDialog mTimePicker; 
      mTimePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { 
       @Override 
       public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { 
        mcurrentTime.set(Calendar.HOUR_OF_DAY, selectedHour); 
        mcurrentTime.set(Calendar.MINUTE, selectedMinute); 
        setAlarm(); 

       } 
      }, hour, minute, true);//Yes 24 hour time 
      mTimePicker.setTitle(R.string.orario); 
      mTimePicker.show(); 
      notificationAlarm = new NotificationAlarm(editText.getText().toString()); 
      getApplicationContext().registerReceiver(notificationAlarm, intentFilter); 
      break; 
}} 


private void setAlarm(){ 
    int id = (int) System.currentTimeMillis(); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,id, intent, PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, mcurrentTime.getTimeInMillis(),1000*60*5, pendingIntent); 
    Log.d("Time", String.valueOf(mcurrentTime.getTimeInMillis())); 

} 



@Override 
public void onResume(){ 
    super.onResume(); 
    final String SOME_ACTION = "com.example.mypackage.a2_pillsrem_WAKE"; 
    intent = new Intent(SOME_ACTION); 
    intentFilter = new IntentFilter(SOME_ACTION); 
} 

这是广播接收器类:

public class NotificationAlarm extends BroadcastReceiver { 
String s; 
int mNotificationId; 
Random r = new Random(); 
ArrayList<Integer> notify = new ArrayList<>(); 
public NotificationAlarm(String s){ 
    this.s=s; 
} 

public void onReceive(Context context, Intent intent) { 
    //RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification); 

    Notification.Builder mBuilder = 
      new Notification.Builder(context) 
        .setSmallIcon(R.drawable.pill) 
        .setContentTitle(context.getString(R.string.titolo_notifica)) 
        .setContentText(context.getString(R.string.descr_notifica)+" "+s) 
        // .setContent(remoteViews) 
        .setAutoCancel(true) 
        .setDefaults(Notification.DEFAULT_SOUND) 
        .setVisibility(1);//1 è uguale a VISIBILITY_PUBLIC 
             // https://developer.android.com/reference/android/support/v4/app/NotificationCompat.html#VISIBILITY_PUBLIC 

    //Random r = new Random(); 
    mNotificationId = r.nextInt(10000); //assegno un id casuale ad ogni notifica affinchè non siano sovrascritte 
    Intent notificationIntent = new Intent(context,MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context,0,notificationIntent,0); 
    mBuilder.setContentIntent(pendingIntent); 
    Log.d("IDNOT",Integer.toString(mNotificationId)); 
    //Gets an instance of the NotificationManager service 
    NotificationManager mNotifyMgr = 
      (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); 
    // Builds the notification and issues it. 
    mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
} 
} 
+0

尝试。如果(SDK_INT = Build.VERSION_CODES.M)alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+ 10000,pendingIntent);其他if(SDK_INT> = Build.VERSION_CODES.M) } –

+0

你是什么意思与SDK_INT? –

+0

内部版本号,检查运行的设备版本是否为 –

回答

0

你试过设置报警器与PendingIntent.FLAG_UPDATE_CURRENT像下面?试试看。

private void setAlarm() { 
     int id = (int) System.currentTimeMillis(); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, mcurrentTime.getTimeInMillis(), 1000 * 60 * 5, pendingIntent); 
     Log.d("Time", String.valueOf(mcurrentTime.getTimeInMillis())); 
    } 

希望这适用于你!

+0

我已经试过设置这样的闹铃,但没有任何改变! –

0

经过多次尝试,我决定不使用BroadcastReceiver而是使用IntentServices。 这是正确的代码和解决方案:

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 

     case R.id.button: 
      mcurrentTime = Calendar.getInstance(); 
      int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY); 
      int minute = mcurrentTime.get(Calendar.MINUTE); 
      TimePickerDialog mTimePicker; 
      mTimePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { 
       @Override 
       public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { 
        mcurrentTime.set(Calendar.HOUR_OF_DAY, selectedHour); 
        mcurrentTime.set(Calendar.MINUTE, selectedMinute); 
        setAlarm(); 

       } 
      }, hour, minute, true);//Yes 24 hour time 
      mTimePicker.setTitle(R.string.orario); 
      mTimePicker.show(); 
      break; 

private void setAlarm(){ 
    int id = (int) System.currentTimeMillis(); 
    Intent intent = new Intent(this, NotificationAlarm.class); 
    intent.putExtra("Farmaco",editText.getText().toString()); 
    PendingIntent pendingIntent = PendingIntent.getService(this,id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, mcurrentTime.getTimeInMillis(),5*60*1000, pendingIntent); 
    } 
    Log.d("Time", String.valueOf(mcurrentTime.getTimeInMillis())); 
} 

这是通知类:

public class NotificationAlarm extends IntentService { 
String s; 
int mNotificationId; 
Random r = new Random(); 
public NotificationAlarm(){ 
    super("HelloNotificationService"); 

} 

@Override 
protected void onHandleIntent(Intent intent) { 

    Notification.Builder mBuilder = 
      new Notification.Builder(getApplicationContext()) 
        .setSmallIcon(R.drawable.pill) 
        .setContentTitle(getApplicationContext().getString(R.string.titolo_notifica)) 
        .setContentText(getApplicationContext().getString(R.string.descr_notifica)+" "+s) 
        // .setContent(remoteViews) 
        .setAutoCancel(true) 
        .setDefaults(Notification.DEFAULT_SOUND) 
        .setVisibility(1);//1 è uguale a VISIBILITY_PUBLIC 
    // https://developer.android.com/reference/android/support/v4/app/NotificationCompat.html#VISIBILITY_PUBLIC 

    mNotificationId = r.nextInt(10000); //assegno un id casuale ad ogni notifica affinchè non siano sovrascritte 
    Intent notificationIntent = new Intent(getApplicationContext(),MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),(int)System.currentTimeMillis(),notificationIntent,PendingIntent.FLAG_ONE_SHOT); 
    mBuilder.setContentIntent(pendingIntent); 
    Log.d("IDNOT",Integer.toString(mNotificationId)); 

// Gets an instance of the NotificationManager service 
    NotificationManager mNotifyMgr = 
      (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE); 

// Builds the notification and issues it. 
    mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
    stopSelf(); 
} 

public int onStartCommand(Intent intent, int flags, int startId){ 
    super.onStartCommand(intent, flags, startId); 
    s = intent.getStringExtra("Farmaco"); 
    return START_STICKY; 
} 
}