【问题标题】:How to set daily repeating notification in android studio at different times each day?如何在每天不同的时间在android studio中设置每日重复通知?
【发布时间】:2017-02-08 18:27:53
【问题描述】:

我目前有每天下午 6 点重复的每日重复通知。我想做的不是下午 6 点,而是在活动即将开始时显示通知。我有一个事件数组列表,它包含日期和时间,这可能吗?以下是我目前显示通知的方式。

这是我的主要活动

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);

这是在我的广播接收器类中

公共类 AlarmReceiver 扩展 BroadcastReceiver{

    @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++;

    }

}

我不知道如何设置时间,以便在发生事件时以及是否有事件时重复。任何指示和帮助都将不胜感激。谢谢

【问题讨论】:

    标签: java android android-studio push-notification notifications


    【解决方案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);
        }
    }
    

    dateInMillis 是 Calender.getInstance().getTimeInMillis(),表示您要为其设置闹钟的时间。所以我希望你有一个长期存储在你的数据库中,这是让你的生活更轻松的价值

    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;
    }
    

    您可以将字符串转换为 Long

    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;
        }
    }
    

    【讨论】:

      【解决方案2】:
      public class DatabaseHandler extends SQLiteOpenHelper {
          private static final String DATABASE_PATH = "/data/data/YOUR_PACKAGE_HERE/databases/";
          private static final String DATABASE_NAME = "YOUR_DATABASE.db";
          private static final int DATABASE_VERSION = 1;
          private SQLiteDatabase myDataBase = null;
      
          private final Context myContext;
          Context context = null;
      
          public DatabaseHandler(Context context) {
              super(context, DATABASE_NAME, null, DATABASE_VERSION);
              this.myContext = context;
              // TODO Auto-generated constructor stub
              myDataBase = this.getWritableDatabase();
              myDataBase.close();
          }
      
          @Override
          public void onCreate(SQLiteDatabase db) {
              // TODO Auto-generated method stub
              db.execSQL("CREATE TABLE IF NOT EXISTS INFO (" +
                      "id INTEGER PRIMARY KEY AUTOINCREMENT," +
                      "alarmTime INTEGER," +
                      "name TEXT)");
          }
      
          public void addInfo(long time, String name) {
              SQLiteDatabase db = this.getWritableDatabase();
      
              ContentValues values = new ContentValues();
              values.put("alarmTime", time);
              values.put("name", name);
      
              db.insert("INFO", null, values);
              db.close();
          }
      
          public ArrayList<NotificationInfo> getInfoAll() {
              String selectQuery;
              SQLiteDatabase db;
              Cursor cursor;
              NotificationInfo ni = new NotificationInfo();
      
              ArrayList<NotificationInfo> result = new ArrayList<NotificationInfo>();
              String myPath = DATABASE_PATH + DATABASE_NAME;
      
              db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
              selectQuery = "SELECT * FROM INFO";
              cursor = db.rawQuery(selectQuery, null);
      
              if (cursor.moveToFirst()) {
                  ni.setAlarmTime(cursor.getLong(cursor.getColumnIndex("alarmTime"));
                  ni.setName(cursor.getLong(cursor.getColumnIndex("name"));
                  result.add(new NotificationInfo(ni));
                  while(cursor.moveToNext()){
                      ni.setAlarmTime(cursor.getLong(cursor.getColumnIndex("alarmTime"));
                      ni.setName(cursor.getLong(cursor.getColumnIndex("name"));
                      result.add(new NotificationInfo(ni));
                  }
              }
              cursor.close();
              db.close();
      
              return result;
          }
      }
      
      public class AlarmActivity extends Activity{
          //standard code for activity goes here
          private void buttonClicked(){
              Calendar c = Calendar.getInstance();
              DatabaseHandler db = new Databasehandler(AlarmActivity.this);
              ArrayList<NotificationInfo> alarms = db.getInfoAll();
              db.close();
      
              for(NotificationInfo ni : alarms){
                  c.setTimeInMillis(ni.getAlarmTime());
                  c.add(Calendar.MINUTE, -30);
                  setAlarm(c);
              }
          }
      
          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);
              }
          }       
      }
      
      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;
          }
      }
      

      【讨论】:

      • 您好,我看到您删除了所有的cmets,很抱歉再次打扰您。我之前问过您为什么要创建您没有响应的 DatabaseHandler 类,请问这应该是对我已经拥有的 sqlite 表的补充还是代表它?我真的很感谢你的努力,但我无法把它们放在一起,如果我能在我把代码放在一起的时候给我一些指导,希望我能让它工作。
      • 我没有删除 cmets。主持人可能做了。我使用数据库助手类,因为它实现了 SQLiteHelper。 SQLLiteHelper 类是一个内置模块,用于处理 android 平台内的数据库操作。它让我可以做 db.insert() 之类的事情。查找android database example
      • 好的,那么您是否创建另一个数据库来保存要传递给通知的日期和名称?
      • 不,你为什么要那样做?我不相信您现在根本没有数据库。如何在没有数据库助手类的情况下创建数据库?显示您的数据库代码。
      • 我在 SQLite 中确实有一个数据库,所以我问你为什么创建 DatabaseHandler 类,因为我看到你正在向其中输入值。
      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多