AlarmManager и уведомления - уведомления не отображаются, сигнал тревоги срабатывает, когда он не должен - PullRequest
0 голосов
/ 15 мая 2018

Я разрабатываю свое первое приложение для Android для клиента. Запуск запланирован на субботу, все работает хорошо ... но одно.

Мне нужно приложение, чтобы подключаться к веб-сайту клиента один раз в 3 дня , загружать информацию о событиях, затем показывать уведомление и (в некоторых случаях) отправлять электронную почту.

То, что происходит сейчас, заключается в том, что приложение не показывает никаких уведомлений, но вместо этого отправляет несколько писем каждый день: это должно означать, что Будильник срабатывает несколько раз в день, а не один раз каждые 3.

В моем манифесте у меня есть два получателя:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

[...]

<receiver android:name=".Helper.AlarmDownload"/>
    <receiver
        android:name=".Helper.AlarmBootReceiver"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

AlarmDownload.java делает много вещей. Все они работают, поэтому я не буду раздражать вас полным кодом. Только конец:

Intent intentToRepeat = new Intent(context, Caricamento.class);
                        intentToRepeat.putExtra(Costanti.string_notif_idcorso,notifica.getInt(Costanti.sp_notifiche_idcorso,0));
                        //set flag to restart/relaunch the app
                        intentToRepeat.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                        //Pending intent to handle launch of Activity in intent above
                        PendingIntent pendingIntent =
                                PendingIntent.getActivity(context, NotificationHelper.ALARM_TYPE_RTC, intentToRepeat, PendingIntent.FLAG_UPDATE_CURRENT);

                        //Build notification
                        String titolonotifica = notifica.getString(Costanti.sp_notifiche_titolonotifica,"");
                        String subtitolo = notifica.getString(Costanti.sp_notifiche_subtitolo,"");
                        Notification repeatedNotification = buildLocalNotification(context, pendingIntent,titolonotifica,subtitolo).build();


                        //Send local notification
                        NotificationHelper.getNotificationManager(context).notify(NotificationHelper.ALARM_TYPE_RTC, repeatedNotification);

[...]

public NotificationCompat.Builder buildLocalNotification(Context context, PendingIntent pendingIntent, String titolo, String subtitolo) {
    NotificationCompat.Builder mBuilder;

    mBuilder = new NotificationCompat.Builder(context, "fisicamente")
            .setContentIntent(pendingIntent)
            .setSmallIcon(R.drawable.icona_app)
            .setContentTitle(titolo)
            .setContentText(subtitolo)
            //.setStyle(new NotificationCompat.BigTextStyle()
            //.bigText(testo))
            .setAutoCancel(true)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setCategory(NotificationCompat.CATEGORY_EVENT);

    return mBuilder;
}

Итак, настоящая проблема должна быть в NotificationHelper.java :

public class NotificationHelper {
public static int ALARM_TYPE_RTC = 100;
private static AlarmManager alarmManager1;
private static PendingIntent alarmIntent1;

public static void scheduleRepeatingRTCNotification(Context context) {
    SharedPreferences pref_login = context.getSharedPreferences(Costanti.SP_LOGIN, Context.MODE_PRIVATE);
    Boolean primavolta = pref_login.getBoolean("primavolta",false);
//primavolta means first time
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    Random r1 = new Random();
    int casuale1 = r1.nextInt(100);
    calendar.set(Calendar.HOUR_OF_DAY, 11);
    calendar.set(Calendar.MINUTE, casuale1);
    if (primavolta && calendar.before(Calendar.getInstance())) calendar.add(Calendar.DAY_OF_MONTH, 1);
//I don't want to show the notification on the first login of the user, so i'm adding one day to the calendar.

    Intent intent = new Intent(context, AlarmDownload.class);
    alarmIntent1 = PendingIntent.getBroadcast(context, ALARM_TYPE_RTC, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager1 = (AlarmManager)context.getSystemService(ALARM_SERVICE);

        alarmManager1.setInexactRepeating(AlarmManager.RTC,
                calendar.getTimeInMillis(), 3 * AlarmManager.INTERVAL_DAY, alarmIntent1);

}

Это то, что я делаю в MainActivity.java , при первом входе пользователя в систему:

Boolean primavolta = preferenze.getBoolean("primavolta",false);
    if (primavolta) {
        //Apre il drawer
        drawer.openDrawer(GravityCompat.START);
        //Notifiche
NotificationHelper.scheduleRepeatingRTCNotification(getApplicationContext());

    }

Ящик открывается только при первом входе в систему, поэтому расписание повторения RTCNotification void не срабатывает более одного раза.

Есть идеи?

Заранее большое спасибо!

Отредактировано: в коде была ссылка на заказчика вместо 3.

...