2016-08-28 2 views
0

Я программировал на Android более года, но раньше не использовал уведомления, которые мне нужны для одного из моих приложений.Отображение нескольких уведомлений в определенные пользователем моменты

В приложении есть события, которые могут быть установлены в разное время. Очевидно, пользователь может изменить это время или добавить/удалить события.

Я планирую использовать оповещения, чтобы уведомить пользователя за 5 минут до начала их мероприятия.

Я прочитал документы разработчиков Android для Building a Notification и Services (к чему я также не знаком). Я решил использовать Service, потому что я решил, что уведомление нужно будет показать, даже если приложение не работает. Чтобы помочь мне, я имею в виду один конкретный SO answer в качестве руководства.

Я начал экспериментируя немного с классами уведомления строителя в моем NotificationService классе так:

public class NotificationService extends IntentService { 

    private static final int NOTIFICATION_ID = 1; 

    public NotificationService() { 
     super(NotificationService.class.getSimpleName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     showNotification(); 
    } 

    private void showNotification() { 
     Intent intent = new Intent(this, MainActivity.class); 

     PendingIntent pendingIntent = PendingIntent.getActivity(
       this, NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
       .setContentTitle("Test notification") 
       .setSmallIcon(R.drawable.ic_event_black_24dp) 
       .setContentText("Test description") 
       .setContentIntent(pendingIntent); 

     NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     manager.notify(NOTIFICATION_ID, builder.build()); 
    } 

} 

Я также использую следующие, чтобы начать этот Service в заставке моего приложения:

Intent serviceIntent = new Intent(this, NotificationService.class); 
startService(serviceIntent); 

Чтобы отображать уведомления в определенное время, я читал около AlarmManager, главным образом через SO questions like this one. Я также знаю, что для отображения нескольких уведомлений мне нужны разные идентификаторы уведомлений (например, моя константа NOTIFICATION_ID).

Однако я не уверен в динамическом обновлении времени, когда уведомления будут отображаться каждый раз, когда событие добавляется, удаляется или изменяется время.

Может ли кто-нибудь предоставить мне некоторые рекомендации о том, как я мог бы это достичь?

ответ

0

Вы реализуете уведомление часть. Для оповещения пользователя в определенное время вы должны установить AlarmManager. Я вставить весь код, который нужно затем объяснить каждую часть:

public class AlarmReceiver extends WakefulBroadcastReceiver { 

    AlarmManager mAlarmManager; 
    PendingIntent mPendingIntent; 

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

     int mReceivedID = Integer.parseInt(intent.getStringExtra(AddReminderActivity.EXTRA_REMINDER_ID)); 

     // Get notification title from Reminder Database 
     ReminderDatabase rb = new ReminderDatabase(context); 
     ApiReminderModel reminder = rb.getReminder(mReceivedID); 
     String mTitle = reminder.getName(); 

     // Create intent to open ReminderEditActivity on notification click 

     // handling when you click on Notification what should happen 
     Intent editIntent = YourActivity.createActivity(context, reminder.getChannelId(), reminder.getStartTime()); 
     PendingIntent mClick = PendingIntent.getActivity(context, mReceivedID, editIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     // Create Notification 
     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) 
       .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_logo)) 
       .setSmallIcon(R.drawable.ic_logo) 
       .setContentTitle(context.getResources().getString(R.string.app_name)) 
       .setTicker(mTitle) 
       .setContentText(mTitle) 
       .setContentIntent(mClick) 
       .setSound(ringtoneUri) 
       .setAutoCancel(true) 
       .setOnlyAlertOnce(true); 

     NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     nManager.notify(mReceivedID, mBuilder.build()); 
    } 

    public void setAlarm(Context context, Calendar calendar, int ID) { 
     mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

     // Put Reminder ID in Intent Extra 
     Intent intent = new Intent(context, AlarmReceiver.class); 
     intent.putExtra(AddReminderActivity.EXTRA_REMINDER_ID, Integer.toString(ID)); 
     mPendingIntent = PendingIntent.getBroadcast(context, ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

     // Calculate notification time 
     Calendar c = Calendar.getInstance(); 
     long currentTime = c.getTimeInMillis(); 
     long diffTime = calendar.getTimeInMillis() - currentTime; 

     // Start alarm using notification time 
     mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + diffTime, mPendingIntent); 

     // Restart alarm if device is rebooted 
     ComponentName receiver = new ComponentName(context, BootReceiver.class); 
     PackageManager pm = context.getPackageManager(); 
     pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
       PackageManager.DONT_KILL_APP); 
    } 


    public void cancelAlarm(Context context, int ID) { 
     mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

     // Cancel Alarm using Reminder ID 
     mPendingIntent = PendingIntent.getBroadcast(context, ID, new Intent(context, AlarmReceiver.class), 0); 
     mAlarmManager.cancel(mPendingIntent); 

     // Disable alarm 
     ComponentName receiver = new ComponentName(context, BootReceiver.class); 
     PackageManager pm = context.getPackageManager(); 
     pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
       PackageManager.DONT_KILL_APP); 
    } 
} 

Как вы видите, у нас есть setAlarm, которые уведомляют пользователей в определенное время. Я также передаю экземпляр календаря, который был инициирован ранее (назначить время, которое пользователь должен уведомлять).

Calendar mCalendar = Calendar.getInstance(); 
     mCalendar.add(Calendar.DAY_OF_YEAR, 7);// assume you want send notification 7 days later 

     new AlarmReceiver().setAlarm(getApplicationContext(), mCalendar, id); 

У нас есть другой способ cancelAlarm. Если вы хотите удалить Alaram, просто передайте уникальный идентификатор Alarm (который уже используется для создания Alarm).

Также не забудьте добавить этот Service к вашему AndroidManifest.xml:

<receiver android:name=".service.AlarmReceiver" /> 

Существует только вещь остается После перезагрузки устройства необходимо установить AlarmsManager снова так что вам нужно BootRecivier обслуживание.

+0

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

+0

@ FarbodSalamat-Zadeh полная реализация может быть найдена по адресу: https://github.com/blanyal/Remindly – Amir

+0

Еще раз спасибо - просто чтобы подтвердить, мне еще нужен мой класс 'Service', который я создал ранее? –

Смежные вопросы