2016-03-21 3 views
1

В моем приложении я хочу выполнять определенную задачу каждый день, и после завершения этой задачи я хочу запускать несколько уведомлений в разное время (эти времена будут вычисляться при выполнении этой задачи). После поиска в Интернете я узнал, что использование AlarmManager - мой лучший вариант:Настройка диспетчера аварийных сигналов для запуска нескольких уведомлений

Этот класс предоставляет доступ к системным службам сигнализации. Это позволяет планировать запуск приложения в определенный момент в будущем. Когда будильник отключается, намерение, которое было зарегистрировано для него, транслируется системой, автоматически запуская целевое приложение, если оно еще не запущено. Зарегистрированные аварийные сигналы сохраняются, когда устройство спит (и при необходимости может разбудить устройство, если оно отключится в течение этого времени), но будет очищено, если оно выключено и перезагружено.

Мои проблемы: 1. Уведомление показывается только для этого первого раза, а не после этого. 2. AlarmManager запускается каждый раз, когда я перезапускаю это приложение, и это прошлое уведомление отображается.

PS .: Я новичок в Android и любая помощь ценится

Вот что я пробовал:

Funtion в моей деятельности от Я настраиваю этот сигнал тревоги:

private void handleNotification() { 

    Intent alarmIntent = new Intent(this, AlarmReciever.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
} 

Это мой AlarmReciever класс:

public class AlarmReciever extends BroadcastReceiver { 

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

    ArrayList<String> times = new ArrayList(); 
    GPSTracker gpsTracker = new GPSTracker(context); 

    //calculate the times arraylist 

    DateFormat format; 
    Date date = null; 
    for (String s : times) { 
     if (hour12) { 
      format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); 
      try { 
       date = format.parse(s); 
      } catch (ParseException e) { 
      } 
     } else { 
      format = new SimpleDateFormat("hh:mm", Locale.ENGLISH); 
      try { 
       date = format.parse(s); 
      } catch (ParseException e) { 
      } 
     } 
     Intent alarmIntent = new Intent(context, NotificationReciever.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 

     Log.d(Constants.LOG_TAG, calendar.getTime().toString()); 

     if (Build.VERSION.SDK_INT < 19) { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
     } else { 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
     } 
    } 
} 

}

И это мой NotificationReciever класс:

public class NotificationReciever extends BroadcastReceiver { 

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

    if (Constants.D) Log.d(Constants.LOG_TAG, "NOTIFICATION RECIEVER"); 

    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
        .setSmallIcon(R.drawable.sc_logo_final) 
        .setContentTitle(context.getResources().getString(R.string.app_name)) 
        .setContentText(context.getResources().getString(R.string.app_name)); 
    Intent resultIntent = new Intent(context, NavigationDrawerActivity.class); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    stackBuilder.addParentStack(NavigationDrawerActivity.class); 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(resultPendingIntent); 
    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(1, mBuilder.build()); 

} 

}

В моей AndroidManifest.xml,

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

     <receiver android:name=".AlarmReciever"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name=".NotificationReciever"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

ответ

2

Прежде всего, этот код, скорее всего, настройка будильника произойдет в полночь текущего дня, что почти наверняка в прошлом по сравнению с текущим временем, что означает, что вы получите будильник очень быстро:

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 

Согласно Javadoc для setRepeating():

Если заявленное время срабатывания в прошлом, тревога немедленно, с кол-сигнала тревоги в зависимости от того, насколько далеко в прошлом Время срабатывания относительно интервала повторения.

Ваш тревоги не повторяется, потому что вы используете флаг INTERVAL_DAY, который работает только с setInexactRepeating().

Если вы хотите что-то запустить в полночь следующего дня, вам нужно будет добавить один день в календарь. Вы также можете рассмотреть возможность установки поля секунд на 0.

Если вы регистрируете будильник каждый раз, когда приложение запускается, вы будете постоянно получать эту раннюю тревогу. Кроме того, согласно Javadoc:

Если уже есть тревога запланирована на тот же IntentSender, он сначала будет отменен.

Тревога не повторяется, потому что вы проходите интервал, который действителен только для setInexactRepeating().

+0

Любая идея, почему уведомления не запускаются в остальное время? –

+0

Да, отредактировал мой ответ. –

+0

Пожалуйста, отметьте еще одну вещь ... Я регистрирую сигнал тревоги после получения разрешения на местоположение (и метод переопределения вызывается каждый раз, когда приложение запускается) ... так идеально, когда я должен регистрировать будильник? Я попытался сделать так: http://stackoverflow.com/a/10836555/4451655, но это не помогло .... –

Смежные вопросы