Android ежедневные уведомления не работает должным образом

Я хотел сделать Ежедневное автоматическое уведомление о сохраненном моем времени.

I’ve got in main activity onCreate:

Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 16);
    calendar.set(Calendar.MINUTE, 35);
    calendar.set(Calendar.SECOND, 0);
    Intent intent1 = new Intent(ActivitySplashScreen.this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ActivitySplashScreen.this, 0,intent1, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) ActivitySplashScreen.this.getSystemService(ActivitySplashScreen.this.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

И мой AlarmReceiver:

public class AlarmReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, ActivitySplashScreen.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.drawable.ic_invite_friends)
                .setContentTitle("Yeah!")
                .setContentText("Do not forget to earn zeni!")
                .setSound(alarmSound)
                .setAutoCancel(true).setWhen(when)
                .setContentIntent(pendingIntent)
                .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
        notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), mNotifyBuilder.build());


    }

}

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

1 ответ

  1.   Calendar cal = Calendar.getInstance();
                cal.set(Calendar.HOUR_OF_DAY, 1);
                cal.set(Calendar.MINUTE, 00);
    
    
    
                Calendar cur_cal = new GregorianCalendar();
                cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar
    
    
                Calendar cal = new GregorianCalendar();
                cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR));
                cal.set(Calendar.HOUR_OF_DAY, 00);
                cal.set(Calendar.MINUTE, 02);
                cal.set(Calendar.SECOND, 0);
                cal.set(Calendar.MILLISECOND, 0);
                cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE) + 1);
                cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));
    
    
                //Create a new PendingIntent and add it to the AlarmManager
                Intent intent = new Intent(getContext(), YourCustomBroadcast.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(),
                        12345, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    
                AlarmManager am =
                        (AlarmManager) getContext().getSystemService(Activity.ALARM_SERVICE);
                am.cancel(pendingIntent);
                am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
    

    попробуйте использовать этот код, укажите точное время ежедневного уведомления в экземпляре календаря
    создайте свой собственный вещательный класс, как это

    public class YourCustomBroadcast extends BroadcastReceiver {
    private final String SOMEACTION = "packagename.ACTION";
    public static int notId = 1;
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        Log.d("inside broadcast", "onReceive: ");
    
        //Toast.makeText(context, "call again", Toast.LENGTH_SHORT).show();
    
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());
    
    
        NotificationCompat.Builder mBuilder =
                (NotificationCompat.Builder) new NotificationCompat.Builder(context)
                        .setSmallIcon(android.R.drawable.sym_def_app_icon)
                        .setContentTitle("Day changed")
                        .setContentText("" + c.getTime().toString());
    
        NotificationManager mNotificationManager =
    
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    
    
        mNotificationManager.notify(++notId, mBuilder.build());
    
    
    
    }
    

    }