Search code examples
androidnotificationsalarmmanager

i want show notification at 8:00 am everyday


I'm trying to send a notification to a user at a specific time at (8:00 am everyday) using an Alarm Manager. but my code not correct work please help me for show notification

my MainActivity

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    AlarmController al=new AlarmController(this);
    al.StartAlarm();

}

My AlarmController

  public class AlarmController {

    private Context m_Context;
    private AlarmManager mgr;
    private static final long PERIOD = 1000 * 30;

    public AlarmController(Context context){

        m_Context = context;
        mgr = (AlarmManager)m_Context.getSystemService(Context.ALARM_SERVICE);
    }

    public void StartAlarm(){



        Intent i = new Intent(m_Context, OnAlarmReceiver.class);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY,8);

        PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
        mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, pi);



        Log.i("AlarmController", "StartAlarm");
    }

    public void StopAlarm(){
        Intent i = new Intent(m_Context, OnAlarmReceiver.class);
        PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
        mgr.cancel(pi);

        Log.i("AlarmController", "StopAlarm");
    }
}

and OnAlarmReceiver

public class OnAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, AppService.class));

} }

AppService

 public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "start job");

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("My notification")
                    .setContentText("از اپ سرویس!");

    int mNotificationId = 001;
    NotificationManager mNotifyMgr =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    mNotifyMgr.notify(mNotificationId, mBuilder.build());
    Log.i(TAG, "stop job");
    return START_STICKY;
}

Solution

  • alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmIntent = new Intent(context of current file, AlarmReceiver1.class);
    
        pendingIntent = PendingIntent.getBroadcast(Menu.this, 0, alarmIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        alarmIntent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
        alarmManager.cancel(pendingIntent);
    
        Calendar alarmStartTime = Calendar.getInstance();
        Calendar now = Calendar.getInstance();
        alarmStartTime.set(Calendar.HOUR_OF_DAY, 8);
        alarmStartTime.set(Calendar.MINUTE, 00);
        alarmStartTime.set(Calendar.SECOND, 0);
        if (now.after(alarmStartTime)) {
            Log.d("Hey","Added a day");
            alarmStartTime.add(Calendar.DATE, 1);
        }
    
         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
         Log.d("Alarm","Alarms set for everyday 8 am.");
    

    Coming to the broadcast receiver class. You need to register your broadcast receiver in the manifest. This will cause you to receive clock events. Override the onReceive method of this broadcast receiver and make a notification there itself or make a seperate notification building service and build and display your notification there.

    The manifest code snippet:

    <receiver android:name="AlarmReceiver1"  android:enabled="true">
    

    The broadcast receiver code snippet:

    public class AlarmReceiver1 extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
          Intent service1 = new Intent(context, NotificationService1.class);
      service1.setData((Uri.parse("custom://"+System.currentTimeMillis())));
                  context.startService(service1);
    }
    

    Notification building service code snippet:

    public class NotificationService1 extends IntentService{
    
        private NotificationManager notificationManager;
        private PendingIntent pendingIntent;
        private static int NOTIFICATION_ID = 1;
        Notification notification;
    @Override
        protected void onHandleIntent(Intent intent) {
    ontext context = this.getApplicationContext();
               notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
     Intent mIntent = new Intent(this, Activity to be opened after clicking on the notif);
                Bundle bundle = new Bundle();
                bundle.putString("test", "test");
                mIntent.putExtras(bundle);
                pendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);    
    
                Resources res = this.getResources();
                NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
                notification = new NotificationCompat.Builder(this)
                            .setContentIntent(pendingIntent)
                            .setSmallIcon(R.drawable.ic_launcher)
                            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
                            .setTicker("ticker value")
                            .setAutoCancel(true)
                            .setPriority(8)
                            .setSound(soundUri)
                            .setContentTitle("Notif title")
                            .setContentText("Text").build();
                notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS;
                notification.defaults |= Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE;
                notification.ledARGB = 0xFFFFA500;
                notification.ledOnMS = 800;
                notification.ledOffMS = 1000;
                notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
                notificationManager.notify(NOTIFICATION_ID, notification);
                Log.i("notif","Notifications sent.");
    
        }
    
    }