java - Android中如何实现多个定时通知

标签 java android notifications

我为我正在创建的应用程序提供了最后一个功能。我制作的应用程序是一个日历,可以保存事件并在时间到达时通知用户。我遇到的问题是,当我创建多个通知(或多个事件)时,它只通知最新创建的通知。我尝试为通知创建不同的 ID,但没有成功。这是我修改的代码。这是我看过的一个教程。

AlarmTask.java

public class AlarmTask implements Runnable{
// The date selected for the alarm
private final Calendar date;
// The android system alarm manager
private final AlarmManager am;
// Your context to retrieve the alarm manager from
private final Context context;

private final long alarmID;

public AlarmTask(Context context, Calendar date, long id) {
    this.context = context;
    this.am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    this.date = date;
    this.alarmID = id;
}

@Override
public void run() {
    // Request to start are service when the alarm date is upon us
    // We don't start an activity as we just want to pop up a notification into the system bar not a full activity

    Intent intent = new Intent(context, NotifyService.class);
    intent.putExtra(NotifyService.INTENT_NOTIFY, true);
    intent.putExtra("alarmID", alarmID);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

    // Sets an alarm - note this alarm will be lost if the phone is turned off and on again
    am.set(AlarmManager.RTC, date.getTimeInMillis(), pendingIntent);
}

}

NotifyService.java

public class NotifyService extends Service {

/**
 * Class for clients to access
 */
public class ServiceBinder extends Binder {
    NotifyService getService() {
        return NotifyService.this;
    }
}

// Unique id to identify the notification.
private static final int NOTIFICATION = 143;
// Name of an intent extra we can use to identify if this service was started to create a notification  
public static final String INTENT_NOTIFY = "com.gpplsmje.mac.calendar.utils.INTENT_NOTIFY";
// The system notification manager
private NotificationManager mNM;

@Override
public void onCreate() {
    Log.i("NotifyService", "onCreate()");
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("LocalService", "Received start id " + startId + ": " + intent);

    // If this service was started by out AlarmTask intent then we want to show our notification
    if(intent.getBooleanExtra(INTENT_NOTIFY, false)){
        showNotification(intent.getLongExtra("alarmID", 0));
    }
    // We don't care if this service is stopped as we have already delivered our notification
    return START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

// This is the object that receives interactions from clients
private final IBinder mBinder = new ServiceBinder();

/**
 * Creates a notification and shows it in the OS drag-down status bar
 */
@SuppressWarnings("deprecation")
private void showNotification(long alarmID) {
    SaveEvent event = new SaveEvent(this);
    event.open();

    Log.d("Notification: ID", alarmID + "");
    // This is the 'title' of the notification
    CharSequence title = event.getEventName(alarmID);
    // This is the icon to use on the notification
    int icon = R.drawable.icon_reminder;
    // This is the scrolling text of the notification
    CharSequence text = event.getEventDesc(alarmID);        
    // What time to show on the notification
    long time = System.currentTimeMillis();

    event.close();

    Intent backToEventDetail = new Intent(this, CalendarEventDetail.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, backToEventDetail, 0);

    Notification notify = new Notification.Builder(this)
        .setContentTitle(title)
        .setContentText(text)
        .setSmallIcon(icon)
        .setContentIntent(contentIntent).getNotification();

    notify.defaults = Notification.DEFAULT_SOUND;


    notify.flags = Notification.FLAG_AUTO_CANCEL;

    // Send the notification to the system.
    mNM.notify(Integer.parseInt(String.valueOf(alarmID)), notify);

    // Stop the service when we are finished
    stopSelf();
}
}

根据我对代码的理解,AlarmTask.java 接收警报日期并将其设置为在该日期发出通知。我传递的ID是我保存在手机数据库中的事件的ID。但我无法让它添加多个通知。它只接收我保存的最新内容。我希望它获取所有事件并为每个事件设置通知。有人可以帮我吗?

最佳答案

像这样创建待处理的 Intent

PendingIntent contentIntent = PendingIntent.getActivity(this, (int)(Math.random() * 100), backToEventDetail, PendingIntent.FLAG_UPDATE_CURRENT);

关于java - Android中如何实现多个定时通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19042254/

相关文章:

android - 在 Android 中隐藏权限 Intent ?

android - 如何在android中为TextView的文本设置样式或字体?

java - arrayList 字符串搜索 : NullPointerException

android - 在实现 DatePickerDialog 的 DialogFragment 中添加中性按钮

java - 枚举加载时编织的方面?

Android - 如何在很长一段时间后(一个月或更长时间)发出警报

ios - 一个活跃的 iOS 应用程序可以知道何时显示另一个应用程序的推送通知吗?

ios - 设置每周调用的通知

java - 远程创建加密的 MySQL 备份

java - 福特-富尔克森实现java