2014-11-11 8 views
6

Ich habe ein SzenarioWie einstellen Alarm für Werktage in android

Einstellen Alarm für (Montag bis Freitag)

Let sagen, dass ich Zeit wählen, die ist: hour = 9, minutes = 15, am_pm = "AM".

Jetzt mag ich Alarm setzen für jeden Monday to Friday at 9:15 AM

-Code unten habe ich versucht, aber nicht gewünschtes Ergebnis zu bekommen.

if(choice.equals("Week Days (Mon-Fri)")) 
{ 
    for(int a = 2; a <= 5; a++) //here I am assuming a is from 2 to 5 (calendar DAY_OF_WEEK from Monday to Friday) 
    { 
     Calendar alarmCalendar = Calendar.getInstance(); 

     alarmCalendar.set(Calendar.HOUR_OF_DAY, _hourOfDay); 

     alarmCalendar.set(Calendar.MINUTE, _minute); 

     alarmCalendar.set(Calendar.SECOND, 0); 

     alarmCalendar.set(Calendar.MILLISECOND, 0); 

     if(am_pm.equals("AM")) 
     { 
      alarmCalendar.set(Calendar.AM_PM, 0); 
     } 
     else 
     { 
      alarmCalendar.set(Calendar.AM_PM, 1); 
     } 


     alarmCalendar.set(Calendar.DAY_OF_WEEK, a); 

     Long alarmTime = alarmCalendar.getTimeInMillis(); 

     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
       alarmTime, 24 * 60 * 60 * 1000 , pendingIntent); 
    } 

    Toast.makeText(ActivityReminder.this, "Meeting Reminder Set on Week Days (Mon-Fri)", 
         Toast.LENGTH_LONG).show(); 
} 

ich verwendet habe, BroadcastReceiver wie:

public class AlarmReceiver extends BroadcastReceiver 
{ 
    NotificationManager mNotificationManager; 

    Context context; 

    public static final String TAG = "Reminder..."; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     this.context = context; 

     String subject = "<h3>Meeting Reminder: </h3>" + intent.getStringExtra("subject"); 

     Toast.makeText(context, Html.fromHtml(subject), Toast.LENGTH_LONG).show(); 

     showNotification(subject); 
    } 

    @SuppressWarnings("deprecation") 
    private void showNotification(String msg) 
    { 
     Intent notificationIntent = new Intent(context.getApplicationContext(), 
       ActivityMainScreen.class); 

     TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 

     stackBuilder.addParentStack(ActivityMainGeofence.class); 

     stackBuilder.addNextIntent(notificationIntent); 

     String arrivalTime = TimeUtil.toString(Calendar.getInstance().getTime(), 
       "dd-MM-yyyy hh:mm:ss a"); 

     notificationIntent.putExtra("subject", msg) 
     .putExtra("time", arrivalTime).putExtra("type", "Meetings/Reminder"); 

     PendingIntent notificationPendingIntent = stackBuilder 
       .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

     Notification notification = new Notification(); 
     notification.icon = R.drawable.app_icon; 

     notification.setLatestEventInfo(context.getApplicationContext(), 
       "WFM Meeting Reminder", Html.fromHtml(msg), notificationPendingIntent); 

     notification.flags |= Notification.FLAG_AUTO_CANCEL; 

     notification.defaults |= Notification.DEFAULT_SOUND; 

     notification.defaults |= Notification.DEFAULT_VIBRATE; 

     NotificationManager mNotificationManager = (NotificationManager) 
       context.getSystemService(Context.NOTIFICATION_SERVICE); 

     mNotificationManager.notify(0, notification); 

    } 
} 

schließlich in Manifest:

<receiver android:name="com.my_package_name.AlarmReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
</receiver> 

EDITED: Hier möchte ich sagen, dass One Time Alarm für mich gearbeitet, aber für über der Week Days (Mon-Fri) funktioniert nicht richtig

Der Arbeitscode lautet:

if(choice.equals("One Time")) 
{ 
    alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); // here PERIOD is the time selected by me in milliseconds... 

    Toast.makeText(ActivityReminder.this, "Meeting Reminder Set One Time", 
      Toast.LENGTH_LONG).show(); 
} 

Wo mache ich falsch. Jede Hilfe wäre willkommen.

Antwort

5

Ich würde annehmen, dass der Alarm nur für Freitag um 9:15 Uhr eingestellt wird? Dies sollte in den Alarmmanager docs wegen der folgenden Zeile sein:

If there is already an alarm scheduled for the same IntentSender, it will first be canceled. http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int, lang, lang, android.app.PendingIntent)

Um das zu tun, was Sie wollen, würden Sie wollen entweder 5 PendingIntents oder stellen Sie einfach einen Alarm für das erste Ereignis ein, und wenn dieser Alarm empfangen wird, stellen Sie den Alarm für den nächsten Tag ein und so weiter.

Ich würde wahrscheinlich mit der zweiten Option gehen, da in der ersten Methode 5 verschiedene PendingIntents benötigt werden, was bedeutet, dass ihr requestCode oder Backing Intent unterschiedlich sein muss (mit anderem Typ, Aktion oder Kategorie).

2

Schauen Sie sich die Seite für AlarmManager an, und sehen Sie sich den Hinweis in setRepeating() an. Ab API 19 sind die Wiederholungsfunktionen ungenau. Um die richtige Wiederholung zu erhalten, müssen Sie jedes Mal mit dem Alarm umgehen und ihn neu planen.

3

Versuchen Sie diesen Code seine für mich gearbeitet ...

for (int k = 2; k < 5; k++) { 
        int sday = k; 
        Calendar today = Calendar.getInstance(); 
        Calendar AlarmDate = Calendar.getInstance(); 
        AlarmDate.set(Calendar.HOUR_OF_DAY, inputH); 
        AlarmDate.set(Calendar.MINUTE, inputM); 
        AlarmDate.set(Calendar.SECOND, 0); 
        while (today.after(AlarmDate)) { 
         AlarmDate.add(Calendar.DAY_OF_MONTH, 1); 
        } 
        while (AlarmDate.get(Calendar.DAY_OF_WEEK) != sday) { 
         AlarmDate.add(Calendar.DAY_OF_MONTH, 1); 
        } 

        Intent i = new Intent(this, AlertPopUpActivity.class); 
        i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
        i.putExtra("uid", k + (alert.getId() * 1000)); //a unique id for alram 
        i.putExtra("id", alert.getId()); 
        i.putExtra("msg", alert.getEventName()); 

        if (minute < 10) 
         i.putExtra("time", hour + ":0" + minute); 
        else 
         i.putExtra("time", hour + ":" + minute); 
        i.putExtra("ampm", inputAMPM); 
        PendingIntent pi = PendingIntent.getActivity(this, 
          k + (alert.getId() * 1000), i,   //same unique id (used to update alram if canceled) 
          PendingIntent.FLAG_UPDATE_CURRENT); 

        am.set(AlarmManager.RTC_WAKEUP, AlarmDate.getTimeInMillis(), pi); 
        System.out.println("Set Time :" + AlarmDate.getTime()); 
       } 
2

) Zu allererst Sie nicht für Schleife für gleiche ausstehende Absicht haben kann, wird es die vorherigen Instanzen gelöscht werden.

) Die Lösung besteht darin, den Alarm erneut durch den Empfänger innerhalb der onReceive-Methode nach Abschluss des Alarms einzustellen.

) Hier ist eine Idee, wie dies zu erreichen, den Rest des Codes gemäß Ihrer Anforderung enthalten. Ich habe Kalender-Klasse verwendet, um Alarm einzustellen, und am Freitag 2 Tage dazwischen überspringen.

) Für "Wahl" in If-else-Bedingung müssen Sie diese Werte irgendwo wie SharedPreferences speichern.

+0

Angenommen, heute ist Montag. Wenn ich deinem Code folge, dann in Switch-Case Kalender.MONDAY wird wahr sein und alarmManager wird es am Montag einstellen ... Gut, aber was ist, wenn am nächsten Tag am DIENSTAG. Wenn ich die App nicht ausführen werde, dann wie Alarm wird durch Calendar.TUESDAY ?? –

+0

Ich glaube, du hast meinen zweiten Punkt nicht bekommen, du musst den Alarm innerhalb der Broadcast-Receiver-Klasse erneut einstellen, wenn du showNotification (subject) anrufst; innerhalb onReceive-Methode. Sie müssen die App nicht ausführen. AlarmManager wird es für Sie tun. – Chitrang