通知只被解雇了一次

时间:2015-05-23 16:57:27

标签: android alarmmanager android-notifications android-alarms

我试图制作一个应用程序,每次用户必须服药时都会触发通知。

问题:我想在特定时间发送通知。我在互联网上搜索,但我只找到了解释如何在指定的时间间隔后发送通知的教程。我有更多次存储在SQLite数据库中,我想为每个数据库发出通知,比如闹钟。

这是我的setAlarm()功能(如果不清楚,请询问):

public void setAlarm()
{
    String mName = NameFld.getText().toString();
    String mFormat = FormatSpn.getSelectedItem().toString();

    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    Calendar current = Calendar.getInstance();

    current.setTime(date);
    calendar.setTime(date);

    char[] sTime = TimeBtn.getText().toString().toCharArray();

    if(sTime[0] == '0')
    {
        calendar.set(Calendar.HOUR_OF_DAY, sTime[1]);
    }
    else
    {
        String tmp = "";
        tmp += sTime[0];
        tmp += sTime[1];

        int hour = Integer.parseInt(tmp);

        calendar.set(Calendar.HOUR_OF_DAY, hour);
    }

    if(sTime[3] == '0')
    {
        calendar.set(Calendar.MINUTE, sTime[4]);
    }
    else
    {
        String tmp = "";
        tmp += sTime[3];
        tmp += sTime[4];

        int minute = Integer.parseInt(tmp);

        calendar.set(Calendar.MINUTE, minute);
    }

    calendar.set(Calendar.SECOND, 0);


    if(current.before(calendar))
    {
        calendar.add(Calendar.DATE, 1);
    }

    Intent intent = new Intent(this, AlarmReceiver.class);

    medName = mName;
    medFormat = mFormat;

    PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    aManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);

}

此功能以小时和分钟值分割日期,并将它们设置为Calendar。一旦运行,我会收到没有标题和文字的通知(我在static函数中管理它们,将药物数据发送到BroadcastReceiver类),当我添加新的警报时,它不会触发。就像我之前说过的那样,我想为每个时间值收到的通知。

这是BroadcastReceiver类:

public class AlarmReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

    String[] data = AddMedicine.getData();

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder.setAutoCancel(true);
    builder.setTicker("It's pill time!");
    builder.setContentTitle(data[0]);
    builder.setContentText(data[1]);
    builder.setSmallIcon(R.drawable.ic_launcher);

    Notification notification = builder.build();
    NotificationManager nManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
    nManager.notify(AddMedicine.NOTIFICATION_ID, notification);
    AddMedicine.NOTIFICATION_ID++;
}
}

如果有人能解决我的问题,我将非常感激。提前谢谢!

编辑:这是getData()方法,它提供药物的名称和格式,以便将它们放入通知的构建中:

public static String[] getData()
{
    String[] data = {medName, medFormat};
    return data;
}

medNamemedFormat是在setAlarm()方法中初始化的全局变量。

2 个答案:

答案 0 :(得分:0)

  • 您正在为PendingIntent使用相同的REQUEST_CODE,它会替换其他PendingIntent。
  • 为每次通话使用 PendingIntent.getBroadcast()方法的不同请求代码(第二个参数)。
  • 您可以使用 SharedPref 来存储一个计数器,该计数器将为每个PendingIntent递增。 示例: -

    Ext.define('App.model.rssSoaFeed_m', {
        extend: 'Ext.data.Model',
        idProperty:'extIdProperty',//renaming the extjs id property
        fields: [
            { name: 'title', type: 'auto' },
            { name: 'id', type: 'auto' }, //my custom id property
        ],
        proxy:
            {
                type: 'ajax',
                url: '/someurl.service',
                extraParams: {
                },
                reader: {
                    type: 'json',
                    root: 'query.results.item'
                }
            }
    });
    

答案 1 :(得分:0)

  

当我添加新闹钟时,它不会触发

您必须为每个requestCode使用唯一标识符(getBroadcast方法的PendingIntent字段),因为您对所有实例使用相同的标识符(0)使用PendingIntent.FLAG_UPDATE_CURRENT,因此只会触发最后创建的一个。

  

我收到没有标题和文字的通知

我认为您必须使用Intent个附加内容将数据发送到AlarmReceiver,因为在您的情况下数据会在AlarmReceiver被触发之前发生变化,因此您会得到错误的值。