0

В настоящее время у меня есть ежедневные повторные уведомления, которые повторяются в 18:00 каждый день. То, что я хочу сделать, вместо 6 вечера, покажет уведомление, когда начнется мероприятие. У меня есть arraylist событий, и он содержит даты и время, это было бы возможно. Ниже показано, как я сейчас показываю уведомления.Как установить ежедневное повторное уведомление в студии Android в разное время каждый день?

Это в моей основной деятельности

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 простирается 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++; 

    } 

} 

Я не знаю, как установить время поэтому он повторяется, когда и если есть событие. Любые указатели и помощь с оценкой. Спасибо

ответ

0

Вы можете установить будильник для каждого события. прочитайте все время событий из своей базы данных и затем настройте индивидуальные аварийные сигналы для этих событий. Вместо setRepeating используйте это. Вариант установленного сигнала тревоги предназначен для разных версий Android, чтобы разбудить телефон от сна.

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

Вы можете преобразовать строку в Лонг

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

Привет, я вижу, что вы удалили все комментарии, извините, что беспокою вас снова. Я уже спрашивал вас, почему вы создали класс DatabaseHandler, на который вы не ответили, могу ли я спросить, должно ли это быть дополнением к таблице sqlite, которую я уже имел или представляю? Я очень ценю ваши усилия, но я не могу собрать все это вместе, если бы мог дать мне небольшое руководство, пока я надеваю код вместе, надеюсь, что смогу заставить его работать. –

+0

Я не удалял комментарии. вероятно, сделал модератор. Я использую вспомогательный класс базы данных, потому что он реализует SQLiteHelper. Класс SQLLiteHelper - это встроенный модуль для обработки операций с базами данных на платформе Android. это то, что позволяет мне делать такие вещи, как db.insert(). Посмотрите [пример базы данных Android] (https://www.tutorialspoint.com/android/android_sqlite_database.htm) –

+0

Итак, создайте ли вы другую базу данных, в которой будут указаны даты и имена для уведомлений? –