2016-03-21 47 views
1

在我的应用程序中,我想每天完成某个任务,然后完成任务,我希望在不同时间触发多个通知(这些时间将在执行该任务时计算)。 谷歌搜索后,我发现使用AlarmManager是我的最佳选择:设置闹钟管理器来触发多个通知

此类提供对系统警报服务的访问。这些允许您安排您的应用程序在未来的某个时间点运行。当警报响起时,已经注册的Intent被系统广播,如果目标应用程序尚未运行,则会自动启动。注册的警报在设备处于睡眠状态时保留(如果在此期间关闭设备,可以选择将设备唤醒),但如果设备关闭并重新启动,则会被清除。

我的问题是: 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但它没有帮助.... –