提问者:小点点

如何在android studio中设置每天不同时间的每日重复通知?


我现在有每天重复的通知,每天下午6点重复。我想做的是不是6pm,而是在事件即将开始时显示通知。我有一个events arraylist,它包含日期和时间,这是可能的。下面是我当前显示通知的方式。

这是我主要的activity

Calendar calendar = Calendar.getInstance();
 calendar.set(Calendar.HOUR_OF_DAY, 18);
 calendar.set(Calendar.MINUTE, 30);
 calendar.set(Calendar.SECOND, 0);
 Intent intent1 = new Intent(MainActivity.this, AlarmReceiver.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0,intent1, PendingIntent.FLAG_UPDATE_CURRENT);
 AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

这是在我的broadcast_reciever课上

公共类AlarmReceiver扩展了

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, EVentsPerform.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.drawable.applogo)
                .setContentTitle("Alarm Fired")
                .setContentText("Events To be PErformed").setSound(alarmSound)
                .setAutoCancel(true).setWhen(when)
                .setContentIntent(pendingIntent)
                .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
        notificationManager.notify(MID, mNotifyBuilder.build());
        MID++;

    }

}

我不确定如何设置时间,所以它会重复什么时候和如果有一个事件。感谢您的任何指点和帮助。谢谢


共1个答案

匿名用户

您可以为每个事件设置一个警报。读取数据库中的所有事件时间,然后为这些事件设置单独的警报。不要使用setRepeating。设定的报警变种是为不同的安卓版本将手机从睡眠中唤醒。

private void setAlarm(Long dateInMillis) {

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (Build.VERSION.SDK_INT >= 23) {
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, dateInMillis, pi);
    } else if (Build.VERSION.SDK_INT >= 19) {
        am.setExact(AlarmManager.RTC_WAKEUP, dateInMillis, pi);
    } else {
        am.set(AlarmManager.RTC_WAKEUP, dateInMillis, pi);
    }
}

DateInmilis是Calender.GetInstance().GetTimeInmilis()用于您要设置警报的时间。所以我希望你有一个长存储在你数据库中,这是使你的生活更容易的价值

public ArrayList<String> getAlarms() {
    SQLiteDatabase db;
    ArrayList<String> result = new ArrayList<String>();
    String myPath = DATABASE_PATH + DATABASE_NAME;

    db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    selectQuery = "SELECT * FROM TABLE";
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        result.add(cursor.getString(cursor.getColumnIndex("WhateverYourColumnIs")));
        while (cursor.moveToNext()) {
            result.add(cursor.getString(cursor.getColumnIndex("WhateverYourColumnIs")));
        }
    }
    cursor.close();
    db.close();

    return result;
}

您可以将字符串转换为一个长的

DatabaseHelper db = new DatabaseHelper();
ArrayList<String> alarms = db.getAlarms()

for(String alarm : alarms){
    try{
        setAlarm(Long.parseLong(alarm));
    }catch(NumberFormatException nfe){
        //Not a number
    }
}

差不多吧

private Long calendarMillis(String date, String time){
    Long result;
    //Do A bunch of stuff to get the information to fill in below from what you bring in.
    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, year);
    //...Calendar.HOUR, Calendar.MONTH, Calendar.DAY
    c.set(Calendar.MINUTE, minute);
    result = c.getTimeInMillis();
    return result;
}

public class NotificationInformation{
    Long alarmTime;
    String name;
    public void NotificationInformation(){

    }
    public void NotificationInformation(NotificationInformation ni){
        this.name = ni.getName();
        this.alarmTime = ni.getAlarmTime();
    }
    //getters and setters
    public void setAlarmTime(Long alarmTime){
        this.alarmTime = alarmTime;
    }
    public void setName(String name){
        this.nime = nime;
    }
    public Long getAlarmTime(){
        return alarmTime;
    }
    public String getName(){
        return name;
    }
}