报警pipe理器 – 安排多个非重复事件

在Android闹钟pipe理器中,我们如何安排多个不重复的闹钟,并且没有固定的时间间隔重复? 由于警报没有任何重复模式,因此我无法使用“setRepeating”function。

我有存储在Sqlite数据库表中的闹钟时间,活动应从该表中selectdate和时间,并设置警报。

如果我们在循环中设置不同的警报,那么它只保留最后一个。 我从post中读到: 如何创build多个警报?

它告诉将附加的唯一ID的意图,然后设置个别的报警事件。 但是这对我没有用。

有什么我们需要添加在清单文件来照顾这个独特的ID?

活动“RegularSchedule”中的代码是,它只创build一个警报事件:

while (notifCursor.moveToNext()) { Intent intent = new Intent(RegularSchedule.this, RepeatingAlarm.class); // The cursor returns first column as unique ID intent.setData(Uri.parse("timer:" + notifCursor.getInt(0))); PendingIntent sender = PendingIntent.getBroadcast( RegularSchedule.this, 0, intent, 0); // Setting time in milliseconds taken from database table cal.setTimeInMillis(notifCursor.getLong(1)); AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender); } 

请让我知道是否需要更多的细节或代码片段。

清单文件(这里RepeatingAlarm扩展BroadcastReceiver):

  <receiver android:name=".user_alerts.RepeatingAlarm" android:process=":remote" /> <activity android:name=".user_alerts.RegularSchedule" android:label="@string/reg_schedule_title" android:theme="@android:style/Theme.Light"> </activity> 

RepeatingAlarm:

 public class RepeatingAlarm extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); ....... // The PendingIntent to launch our activity if the user selects this notification Intent notificationIntent = new Intent (context, DisplayReminder.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); // Set the info for the views that show in the notification panel. notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; notification.defaults |= Notification.DEFAULT_LIGHTS; mNotificationManager.notify(2425, notification); 

Related of "报警pipe理器 – 安排多个非重复事件"

这是为我工作。 我正在分享解决scheme,以便其他人可以受益并find解决此问题的快速解决scheme。

我欢迎任何其他意见,以更多的解决scheme的技术性,为什么某些事情工作,而其他人不:)

(1)首先,清单文件:确保你有你的class的接收器有BroadcastReceiver。

  <receiver android:name=".RepeatingAlarm" android:process=":remote"> <intent-filter> <data android:scheme="timer:" /> </intent-filter> </receiver> 

请注意,课程是主包的一部分。 如果是在一些小包装中,请移到主包装上。 主包是你在'manifest'标签中定义的。

“intent-filter”用于定义“动作”和“数据”。 你可以把这个Activity类放在这里,这个将会被你的未决意图调用。 但是我发现如果你在清单中定义了'action',它不会在活动上显示dynamic值。 它只是显示静态值。 很奇怪。 如果遇到同样的问题,请不要将“操作”放在清单中,而应将其作为待定意图的一部分放入BroadcastReceiver类中。

'data'标签就是你要使用AlarmManager来安排不同的警报的时候把唯一意图的dynamicURI。 请参阅下一步的更多细节。

(2)您要使用AlarmManager安排警报的Activity类:我使用数据库来存储警报时间值,然后使用这些值进行安排。 我的光标从表格中提取唯一的_ID和闹钟时间(自1970年1月1日以来,以秒为单位)。 看到这里放的URI和清单文件里的一样。

  Calendar cal = Calendar.getInstance(); int notifIterator = 0; if (notifCursor.getCount() > 0) { while (notifCursor.moveToNext()) { Intent intent = new Intent(MySchedule.this, RepeatingAlarm.class); // As the same intent cancels the previously set alarm having // same intent // changing the intent for every alarm event so that every alarm // gets // scheduled properly. intent.setData(Uri.parse("timer:" + notifCursor.getInt(0))); PendingIntent sender = PendingIntent.getBroadcast( MySchedule.this, 0, intent, Intent.FLAG_GRANT_READ_URI_PERMISSION); cal.setTimeInMillis(notifCursor.getLong(1) * 1000); AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender); notifIterator++; Toast mToast = Toast.makeText( RegularSchedule.this, "Reminders added to the calendar successfully for " + android.text.format.DateFormat.format( "MM/dd/yy h:mmaa", cal.getTimeInMillis()), Toast.LENGTH_LONG); mToast.show(); } } 

如果在执行此操作后仍未看到警报, 请检查模拟器所占用的时区 。 有时,我们会安排本地时区,但GMT时区的模拟器安排。 如果你看烤面包的消息,这将帮助你找出这个问题。

(3)最后一个是BroadcastReceiver类。 请注意,要打开数据库,您将需要使用“上下文”:

 public void onReceive(Context context, Intent intent) { // Update the status in the notification database table int notificationId = Integer.parseInt(intent.getData().getSchemeSpecificPart()); db = context.openOrCreateDatabase(DATABASE_NAME, SQLiteDatabase.CREATE_IF_NECESSARY, null); <<<< Do DB stuff like fetching or updating something>>>> // Raise the notification so that user can check the details NotificationManager mNotificationManager = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); int icon = R.drawable.icon; CharSequence tickerText = "your text"; long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickerText, when); // Count of number of notifications notification.number = notifCount; CharSequence contentTitle = "your title "; CharSequence contentText = "your notification text"; // The PendingIntent to launch our activity if the user selects this // notification Intent notificationIntent = new Intent(context, DisplayReminder.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); // Set the info for the views that show in the notification panel. notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; notification.defaults |= Notification.DEFAULT_LIGHTS; // Instead of 1234 or any other number, use below expression to have unique notifications // Integer.parseInt(intent.getData().getSchemeSpecificPart()) mNotificationManager.notify(1234, notification); } 

请注意,如果您要创build单独的通知,则在调用notify()时,请求ID可以作为唯一传递。

最后,你可以创buildDisplayReminder类,当用户点击通知时你想调用它。

正如@Jonathon Horsmanbuild议的那样,确保你创build的意图是独一无二的。

如果你想设置10个闹钟例如:

 for(int i=; i<10; i++) { Intent intent = new Intent(YourActivity.this, YourAlarm.class); intent.setData(Uri.parse("timer:" + i); PendingIntent sender = PendingIntent.getBroadcast( YourActivity.this, 0, intent, Intent.FLAG_GRANT_READ_URI_PERMISSION); AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, yourTimeInMillis, sender); } 

为我工作得很好。