Как запустить уведомление в сочетании с AlarmManager?

Я пытаюсь выяснить, как я должен запустить уведомление. Создание уведомления - это не то, о чем я прошу, а способ запустить его в фоновом режиме, чтобы оно было ненавязчивым и пользователь мог делать все, что делал. Это для календаря, напоминание, чтобы быть точным. Также важно отметить, что я использую AlarmManager,

  1. Какой метод я должен использовать, чтобы запустить его в фоновом режиме. BroadCastReciever, Service, так далее.

  2. Исследование, которое я нашел, также представляет проблему с AlarmManager, Когда приложение убито или телефон выключен, сигнал тревоги также. Какой еще метод я должен использовать, чтобы гарантировать, что уведомление будет отображаться для этого события?

Если требуется дополнительная информация, пожалуйста, спросите, и я сделаю это. Заранее спасибо.

3 ответа

Решение

Создать вещательный приемник или интентсервис. Затем...

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);


Date date = new Date(); //set this to some specific time
or Calendar calendar = Calendar.getInstance();

//set either of these to the correct date and time. 

then 
Intent intent = new Intent();
//set this to intent to your IntentService or BroadcastReceiver
//then...
PendingIntent alarmSender = PendingIntent.getService(context, requestCode, intent,
                            PendingIntent.FLAG_CANCEL_CURRENT);
//or use PendingIntent.getBroadcast if you're gonna use a broadcast

                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mAlarmSender); // date.getTime to get millis if using Date directly. 

Если вы хотите, чтобы эти сигналы тревоги работали правильно даже после перезагрузки телефона, добавьте:

        <action android:name="android.intent.action.BOOT_COMPLETED"/>

как фильтр намерений на вашем приемнике в манифесте и воссоздать ваши тревоги в onReceive.

РЕДАКТИРОВАТЬ

Когда вы создаете BroadcastReceiver в своем приложении, это позволяет делать именно то, на что это похоже: получать трансляции в системе. Например, вы можете использовать BroadcastReceiver:

public class MyAwesomeBroadcastReceiver extends BroadcastReceiver {

//since BroadcastReceiver is an abstract class, you must override the following:

    public void onReceive(Context context, Intent intent) {
       //this method gets called when this class receives a broadcast
    }
}

Чтобы отправить широковещательные сообщения этому классу явным образом, вы определяете получателя внутри манифеста следующим образом:

<receiver android:name="com.foo.bar.MyAwesomeBroadcastReceiver" android:enabled="true" android:exported="false">
            <intent-filter>

                <action android:name="SOME_AWESOME_TRIGGER_WORD"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>




            </intent-filter>
        </receiver>

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

Intent i = new Intent("SOME_AWESOME_TRIGGER_WORD");
                sendBroadcast(intent);

Кроме того, поскольку вы сказали android, что хотите получить действие BOOT_COMPLETED, которое транслируется системой, вашему получателю также будет вызван вызов, когда это произойдет.

Используйте AlarmManager - это лучшая практика.

Вот что вы можете сделать:

  1. запуск Service через ваш AlarmManager's в ожидании намерения и напишите свой Notification код в этом сервисе.

  2. Используйте базу данных для хранения всех ваших Alarms а затем перепланировать их при перезагрузке устройства с помощью BOOT_COMPLETEDBroadcast reciver,

Другие вопросы по тегам