2017-03-07 5 views
0

Meine App besteht aus zwei Methoden, nämlich Einmalalarm und Wiederholungsalarm für jeden Tag, Ich muss Alarm basierend auf meiner Anforderung einstellen. Wenn ich einmal Wecker stelle, funktioniert es gut, aber wenn ich Wiederholungsalarm einstelle, funktioniert es nicht. Ich habe an folgender Methode auch gearbeitet, aber es hat für mich gearbeitet.Wie Zeitplan wiederholen Alarm und einmal Alarm in Android

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, hour); // hour - user selected hour 
calendar.set(Calendar.MINUTE, minute); // minute -user selected minute 
// setRepeating() lets you specify a precise custom interval--in this case, 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
    AlarmManager.INTERVAL_DAY, alarmIntent); 

Hier ist die Methode von einmal und wiederholen Sie Alarm in meinem Fragment.

private SimpleDateFormat EEE_DD_MMM_YYYY_HH_MM_SS_A_Formatter = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss a"); //Tue, 07 Mar 2017 10:50:00 a.m. 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity().getBaseContext(), alarmId, intent, 0); // where alarmId is autoIncrement 
    AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(ALARM_SERVICE); 
    try { 
     Date alarmDate = EEE_DD_MMM_YYYY_HH_MM_SS_A_Formatter.parse(getDateTime()); // where we get both time and date from both pickers respectively. 
     if (oneTimeAlarm) { 
     Logs.i(TAG,"one time alarm"); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDate.getTime(), pendingIntent); 
     Log.i(TAG,"one time alarm set!"); 
     } else { 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmDate.getTime(), AlarmManager.INTERVAL_DAY, pendingIntent); 
      Log.i(TAG,"repeat alarm set!"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Und hier ist meine Alarmempfänger Klassendatei

public class AlarmReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

    Vibrator vib = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE); //for Vibration 
    vib.vibrate(2000); 
showNotification(context); 
} 

private void showNotification(Context context) { 
    Intent intent = new Intent(context, MainActivity.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(context,alarmId,intent, 0); 

    // NotificationCompat 
    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
        .setSmallIcon(R.mipmap.ic_launcher) 
        .setContentTitle("Title") 
        .setContentText("text"); 
    mBuilder.setContentIntent(contentIntent); 
    mBuilder.setDefaults(Notification.DEFAULT_SOUND); 
    mBuilder.setAutoCancel(true); 
    NotificationManager mNotificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(1, mBuilder.build());}} 

Antwort

0

mit bereits. Ich benutze das und es funktioniert gut. Und verwenden Sie Service- oder Intent-Service, um Benachrichtigungen zu senden, die nicht Brodcast verwenden.

AlarmManager al; 
    PendingIntent fintent; 
    Calendar calendar; 
    Intent notif; 
    long _alarm; 




    Calendar now = Calendar.getInstance(); 
     Calendar wakeupcall = Calendar.getInstance(); 
     wakeupcall.setTimeInMillis(System.currentTimeMillis()); 
     wakeupcall.set(Calendar.HOUR_OF_DAY, 12); 
     wakeupcall.set(Calendar.MINUTE, 30); 

     if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis()) 
      _alarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1); 
     else 
      _alarm=wakeupcall.getTimeInMillis(); 

al = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     notif= new Intent(this,TestNotifyService.class); 
     fintent = PendingIntent.getService(this,0,notif,0); 

     if (SDK_INT < Build.VERSION_CODES.KITKAT) { 
      al.set(AlarmManager.RTC_WAKEUP,_alarm, fintent); 

     } 
     else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) { 
      al.setExact(AlarmManager.RTC_WAKEUP,_alarm,fintent); 

     } 
     else if (SDK_INT >= Build.VERSION_CODES.M) { 
      al.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_alarm,fintent); 

     } 

Und wenn Sie wollen Daten vom Server holen und dann Meldung posten dann Verwenden Power Manager und Wakelog erfolgreich Meldung zeigen. Und vergessen Sie nicht, die WAKE LOG- und SET ALARM-Berechtigung hinzuzufügen.

Zurücksetzen Alarm nach Benachrichtigung zu erstellen:

private void reSETNOTIFY() { 

     Calendar now = Calendar.getInstance(); 
     Calendar wakeupcall = Calendar.getInstance(); 
     wakeupcall.setTimeInMillis(System.currentTimeMillis()); 
     wakeupcall.set(Calendar.HOUR_OF_DAY, 12); 
     wakeupcall.set(Calendar.MINUTE, 29); 

     if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis()) 
      _alarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1)+25000; 
     else 
      _alarm=wakeupcall.getTimeInMillis()+25000; 

     al = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     notif= new Intent(this,TestNotifyService.class); 
     fintent = PendingIntent.getService(this,0,notif,0); 

     if (SDK_INT < Build.VERSION_CODES.KITKAT) { 
      al.set(AlarmManager.RTC_WAKEUP,_alarm, fintent); 

     } 
     else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) { 
      al.setExact(AlarmManager.RTC_WAKEUP,_alarm,fintent); 

     } 
     else if (SDK_INT >= Build.VERSION_CODES.M) { 
      al.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_alarm,fintent); 

     } 
    } 
+0

oben Code Feueralarm 0.30, dann können Sie denselben Code in Ihren Dienst verwenden, nachdem Sie Benachrichtigung werfen jeden Tag zur Arbeit –

+0

ich den Code ersetzt haben, Alarm hat gefeuert am aktuellen Tag, aber wenn ich das Datum ändern (sagen wir, morgen) Alarm hat nicht ausgelöst. – Karthik

+0

haben Sie den oben genannten Code in Ihrem Dienst oder Broadcat? –