2016-12-05 95 views
1

你好,這是我的第一個關於堆棧溢出的問題。我正在編寫一個Android應用程序,它是一個多計時器。我設置的方式是,當onStop()被調用時,我將取消所有的定時器,並在AlarmManager中啓動四個待定目標,繼續倒計時。如果用戶返回應用程序,AlarmManager中的定時器將被取消,並且會創建新的定時器繼續倒計時。我使用sharedpreferences來存儲所有的值。多重報警brodcastreceiver android

我很確定問題出在我的BroadcastReceiver類中。發生什麼事是我啓動應用程序,我啓動多個定時器,點擊後退按鈕(調用onStop),然後返回到應用程序並停止並重置所有定時器。然後再按一次(再次調用onStop),並且BroadcastReceiver觸發四次。儘管因爲定時器全部被重置,所以它不應該被解僱。

同樣,我認爲問題出在OnReceive上,因爲我沒有爲四個pendingIntents設置它,因爲我無法弄清楚如何。這就是我的實際問題。我可以在一個BroadcastReceiver類中設置四個pendingIntents嗎?如果是這樣,我該怎麼做?

我還想設置它,這樣如果鬧鐘已經播放,並且鬧鐘管理器中的另一個鬧鐘結束了,它不會再次開始播放鬧鐘聲音,而只是更改已存在的通知上的文本。

P.S.我對Android和編程一般都很陌生。我很抱歉,如果這是一個愚蠢的問題,並且如果我的帖子的格式不是很好。

設置AlarmManager代碼:

public void setAlarmManager() { 
    long wakeUpTime = timerPreferences.getStartTime() + millisToCount; 
    long wakeUpTimeTwo = timerPreferences.getStartTimeTwo() + millisToCountTwo; 
    long wakeUpTimeThree = timerPreferences.getStartTimeThree() + millisToCountThree; 
    long wakeUpTimeFour = timerPreferences.getStartTimeFour() + millisToCountFour; 

    Log.v(TAG, "Millis For AM " + millisToCount); 
    Log.v(TAG, "Millis Two For AM " + millisToCountTwo); 
    Log.v(TAG, "Millis Three For AM " + millisToCountThree); 
    Log.v(TAG, "Millis Four For AM " + millisToCountFour); 

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    if (millisToCount > 0) { 
     PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTime, sender), sender); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTime, sender); 
     } 
     Log.v(TAG, "Alarm Manager Set"); 
    } 

    if (millisToCountTwo > 0) { 
     PendingIntent senderTwo = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeTwo, senderTwo), senderTwo); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeTwo, senderTwo); 
     } 
     Log.v(TAG, "Alarm Manager Two Set"); 
    } 

    if (millisToCountThree > 0) { 
     PendingIntent senderThree = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeThree, senderThree), senderThree); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeThree, senderThree); 
     } 
     Log.v(TAG, "Alarm Manager Three Set"); 
    } 

    if (millisToCountFour > 0) { 
     PendingIntent senderFour = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeFour, senderFour), senderFour); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeFour, senderFour); 
     } 
     Log.v(TAG, "Alarm Manager Four Set"); 
    } 
} 

代碼去除AlarmManager:

public void removeAlarmManager() { 
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    PendingIntent senderTwo = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    PendingIntent senderThree = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    PendingIntent senderFour = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    am.cancel(sender); 
    am.cancel(senderTwo); 
    am.cancel(senderThree); 
    am.cancel(senderFour); 
} 

的BroadcastReceiver類報警:

public class AlarmReceiver extends BroadcastReceiver { 

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

    Intent notificationIntent = new Intent(context, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

    NotificationCompat.Builder timerNotificationBuilder = new NotificationCompat.Builder(context); 
    Uri notification = Uri.parse("android.resource://" + "com.example.iinewmanii.professionalkitchentimer" + "/" + R.raw.alarm_clock_short); 
    timerNotificationBuilder.setSound(notification) 
      .setPriority(2) 
      .setColor(Color.rgb(239, 82, 79)) 
      .setContentTitle("Professional Kitchen timer") 
      .setAutoCancel(true) 
      .setContentText("Timer 1 Has Finished") 
      .setSmallIcon(R.mipmap.ic_warning_white_24dp) 
      .setWhen(System.currentTimeMillis()) 
      .setContentIntent(pendingIntent); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       timerNotificationBuilder.setCategory(CATEGORY_ALARM); 
      } 

    Notification timerNotification = timerNotificationBuilder.build(); 
    timerNotification.flags |= Notification.FLAG_INSISTENT; 
    NotificationManager timerNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    timerNotificationManager.notify(0, timerNotification); 
} 

}

回答

0

我結束自己解決這個問題。我需要做的是添加extras到我的AlarmReceiver類可以獲得的意圖,以便辨別我想取消哪個鬧鐘。我認爲與未決意圖傳遞的ID將能夠做到這一點,但該值顯然不會通過。這是我的代碼。

設置報警經理:

private void setAlarmManager() { 
    long wakeUpTime = timerPreferences.getStartTime() + millisToCount; 
    long wakeUpTimeTwo = timerPreferences.getStartTimeTwo() + millisToCountTwo; 
    long wakeUpTimeThree = timerPreferences.getStartTimeThree() + millisToCountThree; 
    long wakeUpTimeFour = timerPreferences.getStartTimeFour() + millisToCountFour; 

    Log.v(TAG, "Millis For AM " + millisToCount); 
    Log.v(TAG, "Millis Two For AM " + millisToCountTwo); 
    Log.v(TAG, "Millis Three For AM " + millisToCountThree); 
    Log.v(TAG, "Millis Four For AM " + millisToCountFour); 

    Log.v(TAG, "Paused Time For AM " + pausedTime); 
    Log.v(TAG, "Paused Time Two For AM " + pausedTimeTwo); 
    Log.v(TAG, "Paused Time Three For AM " + pausedTimeThree); 
    Log.v(TAG, "Paused Time Four For AM " + pausedTimeFour); 

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    if (millisToCount > 0) { 
     intent.putExtra("timerNumberOneId", 1); 
     PendingIntent sender = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTime, sender), sender); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTime, sender); 
     } 
     Log.v(TAG, "Alarm Manager Set"); 
    } 

    if (millisToCountTwo > 0) { 
     intent.putExtra("timerNumberTwoId", 2); 
     PendingIntent senderTwo = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeTwo, senderTwo), senderTwo); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeTwo, senderTwo); 
     } 
     Log.v(TAG, "Alarm Manager Two Set"); 
    } 

    if (millisToCountThree > 0) { 
     intent.putExtra("timerNumberThreeId", 3); 
     PendingIntent senderThree = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeThree, senderThree), senderThree); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeThree, senderThree); 
     } 
     Log.v(TAG, "Alarm Manager Three Set"); 
    } 

    if (millisToCountFour > 0) { 
     intent.putExtra("timerNumberFourId", 4); 
     PendingIntent senderFour = PendingIntent.getBroadcast(this, 4, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeFour, senderFour), senderFour); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeFour, senderFour); 
     } 
     Log.v(TAG, "Alarm Manager Four Set"); 
    } 
} 

刪除報警管理:

private void removeAlarmManager() { 
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    intent.getIntExtra("timerNumberOneId", 0); 
    PendingIntent sender = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    intent.getIntExtra("timerNumberTwoId", 0); 
    PendingIntent senderTwo = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    intent.getIntExtra("timerNumberThreeId", 0); 
    PendingIntent senderThree = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    intent.getIntExtra("timerNumberFourId", 0); 
    PendingIntent senderFour = PendingIntent.getBroadcast(this, 4, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    am.cancel(sender); 
    am.cancel(senderTwo); 
    am.cancel(senderThree); 
    am.cancel(senderFour); 

    Log.v(TAG, "Alarms Removed"); 
} 

AlarmReceiver類:

public class AlarmReceiver extends BroadcastReceiver { 

PrefUtils timerPreferences = null; 
private final static String ALARM_NOTIFICATION = "alarm_notification"; 
private final int timerOneNotifColor = Color.argb(255, 239, 82, 79); 
private final int timerTwoNotifColor = Color.argb(255, 250, 225, 85); 
private final int timerThreeNotifColor = Color.argb(255, 94, 171, 92); 
private final int timerFourNotifColor = Color.argb(255, 250, 150, 27); 
private final int timerOneLightColor = Color.argb(255, 255, 0, 0); 
private final int timerTwoLightColor = Color.argb(255, 255, 255, 0); 
private final int timerThreeLightColor = Color.argb(255, 0, 255, 0); 
private final int timerFourLightColor = Color.argb(255, 255, 55, 0); 

private void alarmNotification(int timerNumber, Context context, int notifColor, int lightColor, Intent intent) { 
    int timerNumberOneId = intent.getIntExtra("timerNumberOneId", 0); 
    int timerNumberTwoId = intent.getIntExtra("timerNumberTwoId", 0); 
    int timerNumberThreeId = intent.getIntExtra("timerNumberThreeId", 0); 
    int timerNumberFourId = intent.getIntExtra("timerNumberFourId", 0); 
    int notifId = 0; 

    Uri notification = Uri.parse("android.resource://" + "com.professionalkitchentools.iinewmanii.professionalkitchentimer" + "/" + R.raw.alarm_clock_short); 

    intent = new Intent(context, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent sender = PendingIntent.getActivity(context, 1, intent, 0); 
    PendingIntent senderTwo = PendingIntent.getActivity(context, 2, intent, 0); 
    PendingIntent senderThree = PendingIntent.getActivity(context, 3, intent, 0); 
    PendingIntent senderFour = PendingIntent.getActivity(context, 4, intent, 0); 

    NotificationCompat.Builder timerNotificationBuilder = new NotificationCompat.Builder(context); 
    int lightFlashingInterval = 500; 
    timerNotificationBuilder.setPriority(2) 
      .setColor(notifColor) 
      .setSound(notification) 
      .setLights(lightColor, lightFlashingInterval, lightFlashingInterval) 
      .setContentTitle("Timer " + timerNumber + " has finished") 
      .setContentText("Professional Kitchen Timer") 
      .setSmallIcon(R.mipmap.ic_warning_white_24dp) 
      .setWhen(System.currentTimeMillis()) 
      .setShowWhen(true) 
      .setGroup(ALARM_NOTIFICATION) 
      .setAutoCancel(true); 
    if (timerNumberOneId == 1) { 
     notifId = 1; 
     timerNotificationBuilder.setContentIntent(sender); 
    } 

    if (timerNumberTwoId == 2) { 
     notifId = 2; 
     timerNotificationBuilder.setContentIntent(senderTwo); 
    } 

    if (timerNumberThreeId == 3) { 
     notifId = 3; 
     timerNotificationBuilder.setContentIntent(senderThree); 
    } 

    if (timerNumberFourId == 4) { 
     notifId = 4; 
     timerNotificationBuilder.setContentIntent(senderFour); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     timerNotificationBuilder.setCategory(CATEGORY_ALARM); 
    } 

    Notification timerNotification = timerNotificationBuilder.build(); 
    timerNotification.flags |= Notification.FLAG_INSISTENT; 
    NotificationManager timerNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    timerNotificationManager.notify(notifId, timerNotification); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    timerPreferences = new PrefUtils(context); 
    int timerNumberOneId = intent.getIntExtra("timerNumberOneId", 0); 
    int timerNumberTwoId = intent.getIntExtra("timerNumberTwoId", 0); 
    int timerNumberThreeId = intent.getIntExtra("timerNumberThreeId", 0); 
    int timerNumberFourId = intent.getIntExtra("timerNumberFourId", 0); 

    if (timerNumberOneId == 1) { 
     alarmNotification(timerNumberOneId, context, timerOneNotifColor, timerOneLightColor, intent); 
     timerPreferences.setTimerOneRunning(false); 
     timerPreferences.setStartTime(0); 
     timerPreferences.setOriginalTime(0); 
     timerPreferences.setTimerPaused(false); 
     timerPreferences.setPausedTime(0); 
    } 

    if (timerNumberTwoId == 2) { 
     alarmNotification(timerNumberTwoId, context, timerTwoNotifColor, timerTwoLightColor, intent); 
     timerPreferences.setTimerTwoRunning(false); 
     timerPreferences.setStartTimeTwo(0); 
     timerPreferences.setOriginalTimeTwo(0); 
     timerPreferences.setTimerTwoPaused(false); 
     timerPreferences.setPausedTimeTwo(0); 
    } 

    if (timerNumberThreeId == 3) { 
     alarmNotification(timerNumberThreeId, context, timerThreeNotifColor, timerThreeLightColor, intent); 
     timerPreferences.setTimerThreeRunning(false); 
     timerPreferences.setStartTimeThree(0); 
     timerPreferences.setOriginalTimeThree(0); 
     timerPreferences.setTimerThreePaused(false); 
     timerPreferences.setPausedTimeThree(0); 
    } 

    if (timerNumberFourId == 4) { 
     alarmNotification(timerNumberFourId, context, timerFourNotifColor, timerFourLightColor, intent); 
     timerPreferences.setTimerFourRunning(false); 
     timerPreferences.setStartTimeFour(0); 
     timerPreferences.setOriginalTimeFour(0); 
     timerPreferences.setTimerFourPaused(false); 
     timerPreferences.setPausedTimeFour(0); 
    } 
} 

}