2017-05-29 64 views
0

我必须在一天中的不同时间发送3个不同的通知(不同的内容)。 继官方文档后,https://developer.android.com/training/scheduling/alarms.html#type, 我能够在指定的时间发送通知,但在更改每个通知的内容时遇到了一些麻烦。以下是设置通知的方法,并在MainActivity的onCreate()方法中调用。Android调度与广播接收器重复报警

public void setNotification() { 
    Intent intent = new Intent(this, MyBroadcastReceiver.class); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    for (int id = 0; id < 3; id++) { 
     Calendar calendar = Calendar.getInstance(); 
     // Defining different pendingIntent 
     switch (id){ 
      case 0: 
       calendar.set(Calendar.HOUR_OF_DAY, 9); 
       break; 
      case 1: 
       calendar.set(Calendar.HOUR_OF_DAY, 14); 
       break; 
      case 2: 
       calendar.set(Calendar.HOUR_OF_DAY, 20); 
       break; 
     } 
     if(calendar.getTimeInMillis() < System.currentTimeMillis()){ 
      calendar.add(Calendar.DATE, 1); 
     } 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id, intent, 0); 
     // setRepeating() schedules an alarm 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 
} 

我知道我可以使用Intent.putExtra()功能发送数据,可用于识别的意图,但如果应用程序被杀害这一数据将会丢失。 即使应用程序未运行或应用程序被终止或设备启动,我也希望它能够正常工作。读完一些资料后,我发现我可以使用BOOT_COMPLETE监听器在设备启动后设置告警。因为在onCreate()方法设置的通知,通知显示,每次我运行应用程序,即使我尝试用下面的代码

if(calendar.getTimeInMillis() < System.currentTimeMillis()){ 
      calendar.add(Calendar.DATE, 1); 
     } 

目前的onReceive方法看起来像这样

public void onReceive(Context context, Intent intent) { 

    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
        .setSmallIcon(R.mipmap.app_icon) 
        .setContentTitle("Title") 
        .setContentText("Message"); 
    Intent resultIntent = new Intent(context, MainActivity.class); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    stackBuilder.addParentStack(MainActivity.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(0, mBuilder.build()); 
} 

来解决这个我需要帮助决定应该在哪里放置setNotification()方法,以便它将所有警报注册一次,以及如何识别哪个意图即将到来,以便采取适当的行动。一种解决方法是使用意向过滤器定义3个不同的broadcastReceivers,并在创建它们时设置意向URI。这是正确的方式还是有其他简单的解决方案?

回答

0

如何识别其意图来,这样可以 采取相应的操作

您需要设置意图的行动,以便在广播接收器

Intent intent = new Intent(this, MyBroadcastReceiver.class); 
intent.setAction("THIS_IS_MY_ACTION"); 

接收数据BOOT_COMPLETE
的情况取消引导中的所有警报,并重置它们。要取消警报请在AlarmManager上拨打cancel(),并使用PendingIntent,您在使用setRepeating()设置警报时使用过相同的PendingIntent

照顾contextINTENT_FLAGS,同时与AlarmManager一起工作。

使用getApplicationContext()上下文和保持,因为它们会同时取消报警使用request_code的记录,使用PendingIntent.FLAG_UPDATE_CURRENT

这可能帮助: -

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT) 
1

通知出现每次我运行应用程序,

保留使用SharedPreference的检查,并只设置如果没有完成。

而且你的代码

if(calendar.getTimeInMillis() < System.currentTimeMillis()){ 
    calendar.add(Calendar.DATE, 1); 
} 

应该有点像这样

Calendar calendar = Calendar.getInstance(); 
// Get the current time in millis 
long currentTime = calendar.getTimeInMillis(); 
// Set the reminder times 
switch(id) { 
    .. 
    .. 
} 
//Get the reminder time in millis 
long intendedTime = calendar.getTimeInMillis(); 

if (intendedTime < currentTime) { 
    // Set from next day and to repeat once a day. 
    // you might consider using calendar.add() for adding one day to the current day 

    calendar.add(Calendar.DAY_OF_MONTH, 1); 
    intendedTime = calendar.getTimeInMillis(); 

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); 
} else { 
    // Set for today and to repeat once a day. 
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, intendedTime, 
      AlarmManager.INTERVAL_DAY, pendingIntent); 
} 
+0

谢谢您的建议。我会相应地修改我的代码。 – Ranjan