Добавление уведомлений в Android не работает с помощью AlarmManager и BroadcastReceiver
У меня есть возможность для пользователя выбрать время уведомления для его / ее домашней работы, и когда он это сделает, я хочу установить уведомление, которое он получит в то время, которое он выбрал, которое будет напоминать ему, чтобы он сделал свою домашнюю работу.
Пропустите здесь, если вы хотите сразу перейти к части уведомления: if(newNotificationDate!= Null) {
public void AddHomework() {
DataBaseManager manager = new DataBaseManager(AddHomeworkActivity.this);
if (!TextUtils.isEmpty(Subject.getSelectedItem().toString()) && !TextUtils.isEmpty(HomeworkDescription.getText()))
{
Homework homework = new Homework(Subject.getSelectedItem().toString(), HomeworkDescription.getText().toString());
if (!TextUtils.isEmpty(mDueDate.getText()) && !TextUtils.isEmpty(mDueTime.getText()))
{
String newDate = mDueDate.getText().toString().concat(" " + mDueTime.getText().toString());
SimpleDateFormat formatter = new SimpleDateFormat(getString(R.string.dateFormat) , Locale.US);
try {
homework.setDueDate(formatter.parse(newDate));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
if (!TextUtils.isEmpty(mNotificationDate.getText()) && !TextUtils.isEmpty(mNotificationTime.getText())) {
String newDate = mNotificationDate.getText().toString().concat(" " + mNotificationTime.getText().toString());
SimpleDateFormat formatter = new SimpleDateFormat(getString(R.string.dateFormat),Locale.US );
Date newNotificationDate = null;
try {
homework.setReminderTime(formatter.parse(newDate));
newNotificationDate = homework.getReminderTime();
} catch (Exception e) {
System.out.println(e.getMessage());
}
if(newNotificationDate != null) {
Intent notifyIntent = new Intent(this, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast
(context, 1, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, newNotificationDate.getTime(), pendingIntent);
}
}
manager.AddHomework(homework);
}
}
Я добавил класс MyReceiver:
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Intent intent1 = new Intent(context, MyNewIntentService.class);
Toast.makeText(context, "Alarm running", Toast.LENGTH_SHORT).show();
context.startService(intent1);
}
}
Я также добавил класс
public class MyNewIntentService extends IntentService {
private static final int NOTIFICATION_ID = 3;
public MyNewIntentService() {
super("MyNewIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Notification.Builder builder = new Notification.Builder(this);
builder.setContentTitle("My Title");
builder.setContentText("This is the Body");
builder.setSmallIcon(R.mipmap.app_icon_round);
Intent notifyIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 1, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//to be able to launch your activity from the notification
builder.setContentIntent(pendingIntent);
Notification notificationCompat = builder.build();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);
managerCompat.notify(NOTIFICATION_ID, notificationCompat);
}
}
Я также добавил их в папку манифеста:
<service
android:name=".MyNewIntentService"
android:exported="false" >
</service>
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
.
.
.
.
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Все же это не работает, и я не получаю никакого уведомления вообще. Любое понимание? Дата уведомления корректно превращается в переменную типа Date и включает дату, выбранную пользователем для уведомления. Я хочу, чтобы пользователь получал уведомление на панели уведомлений независимо от того, открыто приложение или нет в указанное время. Я следовал некоторым руководствам, и это то, что я придумал, но я не уверен, должно ли это выполнить то, что я хочу точно.
Спасибо за помощь заранее.