设置Alarm Manager以触发多个通知

时间:2016-03-21 02:25:18

标签: android notifications alarmmanager

在我的应用程序中,我想每天执行某项任务,在完成任务后,我想在不同时间触发多个通知(这些时间将在执行该任务时计算)。 谷歌搜索后我发现使用AlarmManager是我最好的选择:

  

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

我的问题是: 1.通知仅在第一次显示,而不是在此之后显示。 2.每次重新启动该应用程序时都会触发AlarmManager,并显示过去的通知。

PS:我是Android的新手,感谢任何帮助

以下是我的尝试:

我的活动中的功能我正在设置此警报:

    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>

1 个答案:

答案 0 :(得分:2)

首先,这段代码最有可能在当天午夜设置一个警报,几乎可以肯定是过去与当前时间相比,这意味着你&#39 ;我会很快收到警报:

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);

根据setRepeating()的javadoc:

  

如果声明的触发时间是过去的,则会触发警报   立即,报警数量取决于过去的距离   触发时间相对于重复间隔。

您的闹钟不会重复,因为您使用的旗帜INTERVAL_DAY仅适用于setInexactRepeating()

如果您想在下一个日的午夜运行某些内容,则需要在日历中添加一天。您也可以考虑将秒字段设置为0。

如果您每次启动应用程序时都会注册闹钟,那么您每次都会获得早期闹钟。另外根据javadoc:

  

如果已经为同一个IntentSender安排了警报,那么   将首先被取消。

警报不会重复,因为您传递的时间间隔仅对setInexactRepeating()有效。