Для некоторых приложений Android я хотел бы добавить следующую функцию:
Пользователь может определить время, когда он хочет что-то напомнить. Когда наступит время, приложение должно создать уведомление в панели уведомлений, даже если пользователь не использует приложение в данный момент.
Для этой цели следует обратить внимание на классы AlarmManager, NotificationManager und Notification.Builder, верно?
Так как мне заранее создать синхронизированное уведомление? Мой код (пока) это:
Добавьте это в AndroidManifest для регистрации приемника вещания:
<receiver android:name="AlarmNotificationReceiver"></receiver>
Создайте новый файл класса, который обрабатывает получаемый им сигнал тревоги:
public class AlarmNotificationReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
String additionalData = extras.getString("displayText");
// show the notification now
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification mNotification = new Notification(R.drawable.ic_launcher, context.getString(R.string.app_name), System.currentTimeMillis());
PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0); // open MainActivity if the user selects this notification
mNotification.setLatestEventInfo(context, context.getString(R.string.app_name), additionalData, pi);
mNotification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND;
mNotificationManager.notify(1, mNotification);
}
}
}
Используйте этот код (например, в MainActivity), чтобы установить будильник на 3 секунды:
Intent i = new Intent(this, AlarmNotificationReceiver.class);
i.putExtra("displayText", "sample text");
PendingIntent pi = PendingIntent.getBroadcast(this.getApplicationContext(), 234324246, i, 0);
AlarmManager mAlarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mAlarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+3*1000, pi);
Что мне нужно изменить, чтобы сделать эту работу? Спасибо!
Две проблемы:
- Текст уведомления не изменяется при изменении его в коде. Это только изменяется, когда я изменяю requestCode в PendingIntent.getBroadcast (...). О чем этот код запроса? Это может быть случайное значение или 0?
- После перезагрузки телефона «запланированное» уведомление или сигнал тревоги исчезли. Но теперь я видел, что это нормальное поведение, верно? Как я могу обойти это?