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; 
} 
}