2013-12-10 4 views
0

안녕하세요, 사용자에게 특정 시간에 매일 약을 먹을 것을 상기시키는 안드로이드 응용 프로그램이 있습니다. 그러므로 나는 Notifications와 BroadcastReceiver를 사용한다. 특정 시간 (예 : 6 시간)에 알림이 표시되도록 설정하면 해당 특정 시간에 "[App]이 (가) 중지되었습니다"대화 상자 만 표시됩니다. 그런 다음 디버그 모드로 이동하여 알림을 표시하도록 설정하면 1 분과 같이 모든 오류없이 모든 방법을 거치며 알림을받습니다. Android 알림 사용 중 이상한 오류가 발생했습니다.

AlarmReceiver receiver = new AlarmReceiver(); 
receiver.cancelAlarm(NotificationActivity.this); 
receiver.setRecurringAlarm(NotificationActivity.this); 

이 사람이 나를 도울 수

: 알람이 (다른 활동에서) 다음과 같은 방법을 설정

public class AlarmReceiver extends BroadcastReceiver { 

String notificationTitle; 
String notificationText; 

@Override 
public void onReceive(Context context, Intent intent) { 
     //Monday = 1, Tuesday = 2, etc. 
     int actualDay = new DateTime().getDayOfWeek(); 
     if (getTypeOfNotification() == NotificationType.TYPE_DOSE) { 
      notificationTitle = context.getString(R.string.notificationPills); 
      notificationText = context.getString(R.string.notificationDose1)+ " " + DataStorage.getInstance().getSelectedWeeklyDose()[actualDay - 1] + " " + context.getString(R.string.notificationDose2); 
     } 
     else { 
      notificationTitle = context.getString(R.string.notificationMeasurement); 
      notificationText = context.getString(R.string.notificationMeasurementText); 
     } 
     showNotification(context); 
} 

public void setRecurringAlarm(Context context) { 
    Calendar updateTime = Calendar.getInstance(); 
     updateTime.set(Calendar.HOUR_OF_DAY, DataStorage.getInstance().getSelectedNotificationTime().getHourOfDay()); 
     updateTime.set(Calendar.MINUTE, DataStorage.getInstance().getSelectedNotificationTime().getMinuteOfHour()); 
     updateTime.set(Calendar.SECOND, 0); 
     //check if that time is already reached and if yes, start a new alarm tomorrow 
     Calendar rightNow = Calendar.getInstance(); 
     if (rightNow.after(updateTime)) { 
      updateTime.add(Calendar.DAY_OF_MONTH, 1); 
     } 
     setAlarm(AlarmManager.INTERVAL_DAY, updateTime, context); 
} 

private void setAlarm(long interval, Calendar updateTime, Context context) { 
    Intent notificator = new Intent(context, AlarmReceiver.class); 
    PendingIntent recurringNotification = PendingIntent.getBroadcast(context, 
      0, notificator, 0); 
    AlarmManager alarms = (AlarmManager) context.getSystemService(
      Context.ALARM_SERVICE); 
    alarms.cancel(recurringNotification); 
    alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      updateTime.getTimeInMillis(), interval, recurringNotification); 
} 

public void cancelAlarm(Context context) { 
    Intent notificator = new Intent(context, AlarmReceiver.class); 
    AlarmManager alarms = (AlarmManager) context.getSystemService(
      Context.ALARM_SERVICE); 
    PendingIntent cancelNotification = PendingIntent.getBroadcast(context, 
      0, notificator, PendingIntent.FLAG_CANCEL_CURRENT); 
    alarms.cancel(cancelNotification); 
} 

private void showNotification(Context context){ 
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Intent myIntent = new Intent(Intent.ACTION_VIEW); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
      myIntent, Intent.FLAG_ACTIVITY_NEW_TASK); 
    Notification noti = new NotificationCompat.Builder(context) 
      .setContentTitle(notificationTitle) 
      .setContentText(notificationText) 
      .setSmallIcon(R.drawable.pills) 
      .setContentIntent(pendingIntent).build(); 
    noti.defaults |= Notification.DEFAULT_SOUND; 
    noti.flags |= Notification.FLAG_AUTO_CANCEL; 
    notificationManager.notify(0, noti); 
} 

private NotificationType getTypeOfNotification() { 
    DateTime latestMeasurement = DataStorage.getInstance().getLatestMeasurementDate(); 
    //First check special case if there is no latest measurement. Then set actual date. 
    if (latestMeasurement != null) { 
     Calendar today = Calendar.getInstance(); 
     if (today.get(Calendar.DAY_OF_YEAR) - latestMeasurement.getDayOfYear() == DataStorage.getInstance().getSelectedMeasureInterval()) { 
      return NotificationType.TYPE_MEASUREMENT; 
     } 
     else return NotificationType.TYPE_DOSE; 
    } 
    else { 
     return NotificationType.TYPE_DOSE; 
    } 
} 

}는 다음과 같이 내 브로드 캐스트 리시버 클래스는?

+0

귀하의 logcat 오류를 게시하십시오. –

+0

귀하의 휴대 전화가 컴퓨터에 연결되어있는 상태에서'adb logcat'. – Pedantic

답변

0

나는 당신의 도움으로 그것을 발견했습니다. 콘솔에서 logcat 오류를 제공 할 수 있다는 것을 몰랐습니다. 이 오류는 알림을 수신 할 때 발생하는 잘못된 데이터베이스 조회입니다.

감사합니다.

관련 문제