如何通过警报管理器设置多个通知?
How to set up Multiple Notifications through Alarm Manager?
我将字符串时间值存储在数据库中。我可以使用下面的代码访问这些,这将返回并记录所有时间值。
我需要针对这些单独的时间值向用户发送通知,但我没有成功。它似乎只向我发送我输入的最后一个条目的通知,这是为什么?
广播接收器 有 onRecieve 方法
@Override
public void onReceive(Context context, Intent intent)
{
helper = new TaskDBHelper(context);
SQLiteDatabase sqlDB = helper.getReadableDatabase();
Cursor cursor = sqlDB.query(TaskContract.TABLE,
new String[]{TaskContract.Columns._ID, TaskContract.Columns.TASK, TaskContract.Columns.DATE},
null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Name = cursor.getString(1);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_cast_light)
.setContentTitle("Please Take " + Name)
.setContentInfo("Time")
.setContentText("Enjoy" )
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setVibrate(new long[]{500, 500, 500, 500}) //set virbrate & color of led
.setLights(Color.BLUE, 3000, 3000);
NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.notify(getID(), builder.build());
cursor.moveToNext();
}
}
方法 查找并循环遍历数据库中的值。
private void setUpNot(){
helper = new TaskDBHelper(Meds2.this);
SQLiteDatabase sqlDB = helper.getReadableDatabase();
Cursor cursor = sqlDB.query(TaskContract.TABLE,
new String[]{TaskContract.Columns._ID, TaskContract.Columns.TASK, TaskContract.Columns.DATE},
null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) { // Loop until all vales have been seen
String time = cursor.getString(2);
String[] parts = time.split(":"); //Split String Value stored in db
String part1 = parts[0]; // hour
String part2 = parts[1]; // minute
int hr = Integer.parseInt(part1);
int min = Integer.parseInt(part2);
final int _id=(int)System.currentTimeMillis();
Intent alarmIntent = new Intent(Meds2.this, AlarmReceiver.class); //set up alarm
pendingIntent = PendingIntent.getBroadcast(Meds2.this, _id, alarmIntent, 0);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hr);
calendar.set(Calendar.MINUTE, min); //set cal time based of db value
/* Repeating on every 24 hours interval */
manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent); // run every date.time() in millisec
Log.e(TAG, "DATE VALUE TIME IS " + part1 +"--" +part2); //log part one and two to make sure time is right
cursor.moveToNext();
}
}
getid()
public static int getID() {
AtomicInteger c = new AtomicInteger(0);
return c.incrementAndGet();
}
问题出在您的 getID()
方法上。
您的 getID()
方法将始终 return 1,因此每次都将通知 ID 设置为“1”,这意味着您始终在更新通知而不是创建新通知。这就是为什么即使您正在创建多个通知,您也只会收到一个通知。
您必须像这样修改您的 getID() 方法:
static AtomicInteger c = new AtomicInteger(0);
public static int getID() {
return c.incrementAndGet();
}
通过这样做,您每次都会获得不同的 ID,因此会收到不同的通知。
我将字符串时间值存储在数据库中。我可以使用下面的代码访问这些,这将返回并记录所有时间值。
我需要针对这些单独的时间值向用户发送通知,但我没有成功。它似乎只向我发送我输入的最后一个条目的通知,这是为什么?
广播接收器 有 onRecieve 方法
@Override
public void onReceive(Context context, Intent intent)
{
helper = new TaskDBHelper(context);
SQLiteDatabase sqlDB = helper.getReadableDatabase();
Cursor cursor = sqlDB.query(TaskContract.TABLE,
new String[]{TaskContract.Columns._ID, TaskContract.Columns.TASK, TaskContract.Columns.DATE},
null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Name = cursor.getString(1);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_cast_light)
.setContentTitle("Please Take " + Name)
.setContentInfo("Time")
.setContentText("Enjoy" )
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setVibrate(new long[]{500, 500, 500, 500}) //set virbrate & color of led
.setLights(Color.BLUE, 3000, 3000);
NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.notify(getID(), builder.build());
cursor.moveToNext();
}
}
方法 查找并循环遍历数据库中的值。
private void setUpNot(){
helper = new TaskDBHelper(Meds2.this);
SQLiteDatabase sqlDB = helper.getReadableDatabase();
Cursor cursor = sqlDB.query(TaskContract.TABLE,
new String[]{TaskContract.Columns._ID, TaskContract.Columns.TASK, TaskContract.Columns.DATE},
null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) { // Loop until all vales have been seen
String time = cursor.getString(2);
String[] parts = time.split(":"); //Split String Value stored in db
String part1 = parts[0]; // hour
String part2 = parts[1]; // minute
int hr = Integer.parseInt(part1);
int min = Integer.parseInt(part2);
final int _id=(int)System.currentTimeMillis();
Intent alarmIntent = new Intent(Meds2.this, AlarmReceiver.class); //set up alarm
pendingIntent = PendingIntent.getBroadcast(Meds2.this, _id, alarmIntent, 0);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hr);
calendar.set(Calendar.MINUTE, min); //set cal time based of db value
/* Repeating on every 24 hours interval */
manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent); // run every date.time() in millisec
Log.e(TAG, "DATE VALUE TIME IS " + part1 +"--" +part2); //log part one and two to make sure time is right
cursor.moveToNext();
}
}
getid()
public static int getID() {
AtomicInteger c = new AtomicInteger(0);
return c.incrementAndGet();
}
问题出在您的 getID()
方法上。
您的 getID()
方法将始终 return 1,因此每次都将通知 ID 设置为“1”,这意味着您始终在更新通知而不是创建新通知。这就是为什么即使您正在创建多个通知,您也只会收到一个通知。
您必须像这样修改您的 getID() 方法:
static AtomicInteger c = new AtomicInteger(0);
public static int getID() {
return c.incrementAndGet();
}
通过这样做,您每次都会获得不同的 ID,因此会收到不同的通知。