Отправлять уведомление раз в неделю

Я хочу уведомить пользователя об ответе на еженедельные вопросы. Мне нужно отправить уведомление пользователю, даже если мое приложение не запущено. Уведомление будет отправляться раз в неделю. Когда пользователь нажимает уведомление, мое приложение открывается. Я пробовал это через Timer и TimerTask(). Это уведомляет пользователя, когда мое приложение запущено. Как я могу отправить уведомление пользователю, пока приложение не запущено.

Кто-нибудь может мне помочь?


person Jolly    schedule 28.11.2013    source источник
comment
Попробуйте использовать AlarmManager!   -  person Lazy Ninja    schedule 28.11.2013
comment
Вы изучали API уведомлений как Urban Air Ship?   -  person Pull    schedule 28.11.2013
comment
Как я могу связать AlarmManager с классом уведомлений   -  person Jolly    schedule 28.11.2013
comment
Вам нужно использовать AlarmManager и метод setRepeating() с интервалом времени AlarmManger.DAY * 7.   -  person Simon Dorociak    schedule 28.11.2013


Ответы (1)


В следующем коде используется Alarmmanager с BroadcastReceiver, который поможет вам в достижении ваших потребностей.

В вашей деятельности:

Intent intent = new Intent(MainActivity.this, Receiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, REQUEST_CODE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(am.RTC_WAKEUP, System.currentTimeInMillis(), am.INTERVAL_DAY*7, pendingIntent);

System.currentTimeInMillis() — указывает, что будильник сработает в текущее время, вы можете передать постоянное время дня в миллисекундах.

Затем создайте класс Receiver примерно так:

public class Receiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        showNotification(context);
    }

    public void showNotification(Context context) {
        Intent intent = new Intent(context, AnotherActivity.class);
        PendingIntent pi = PendingIntent.getActivity(context, reqCode, intent, 0);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.android_icon)
            .setContentTitle("Title")
            .setContentText("Some text");
        mBuilder.setContentIntent(pi);
        mBuilder.setDefaults(Notification.DEFAULT_SOUND);
        mBuilder.setAutoCancel(true);
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(reqCode, mBuilder.build());
    }
}

Также вы должны зарегистрировать свой класс BroadcastReceiver в файле манифеста, как показано ниже. В вашем файле AndroidManifest.xml внутри тега

<receiver android:name="com.example.receivers.Receiver"></receiver>

Здесь «com.example.receivers.Receiver» — это мой пакет и имя получателя.

person Prakash Jackson    schedule 28.11.2013
comment
Могу я узнать, что это за REQUEST_CODE+2 в ожидающем намерении? - person Jolly; 28.11.2013
comment
REQUEST_CODE — это некоторое целочисленное значение, которое делает ожидающее намерение уникальным. Я инициализировал значение для этого. - person Prakash Jackson; 28.11.2013
comment
Я поставил 0 для места. Почему вы добавляете 2 к этому значению? Имеет ли INTERVAL_DAY какое-либо значение. Для проверки мне нужно заменить это значение? - person Jolly; 28.11.2013
comment
Я отредактировал его для вашего удобства, просто передайте любое значение вместо REQUEST_CODE. И INTERVAL_DAY встроен в андроид, он имеет значение миллисекунд для одного дня. В течение одной недели я умножил его на 7. Вам не нужно менять его значение. - person Prakash Jackson; 28.11.2013
comment
Да, конечно, для проверки вы можете изменить INTERVAL_DAY на небольшое значение. Например, если вы замените его на 30 * 1000, будильник будет срабатывать каждые 30 секунд. - person Prakash Jackson; 28.11.2013
comment
Я предполагаю, что вы не включили свой приемник в свой файл AndroidManifest.xml, я отредактировал ответ, пожалуйста, взгляните на это. - person Prakash Jackson; 28.11.2013
comment
Приведенный выше код также отправляет уведомление о запуске приложения :(. Пожалуйста, помогите - person Jawad Amjad; 28.04.2014
comment
Спасибо за ваш ответ, разве это не должно быть System.currentTimeMillis() вместо System.currentTimeInMillis()? - person La masse; 11.12.2015
comment
А если раз в день в 12 часов? - person Si8; 26.11.2016