Notifications in specific time every day android

2019-01-10 23:49发布

问题:

I'd like to make an app that let the user decide what time everyday wants him to remind something with notification...

I'd like to know how am i supposed to trigger a notification in secific time the user wants e.x 7:00am and make him tap on the notification and enter the application in specific activity. But when the user doesn't want to get any more notifications (with a button click) how am i cancel all the notifications...?

I made something like

Intent intent = new Intent(this, main.class);
Bundle bundle = new Bundle();
bundle.putString("title", "Some Title");\
intent.putExtras(bundle);   
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
String body = "Tap to see the Activity"; 
String title = "Title of notification"; 
Notification n = new Notification(R.drawable.ic_launcher, body, System.currentTimeMillis());
n.setLatestEventInfo(this, title, body, pi);
n.defaults = Notification.DEFAULT_ALL;
nm.notify(uniqueID, n);

but no luck until now....

Thanks...

<<>>

i'm doing this

        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

        int icon = R.drawable.notification_icon;
        CharSequence tickerText = "Ome TickerText"; 
        long when = System.currentTimeMillis();
        Context context = getApplicationContext();
        CharSequence contentTitle = "Some Title"; 
        CharSequence contentText = "Some Text"; 

        Intent notificationIntent = new Intent(context, LandingActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("title", "a title");
        bundle.putString("title2", "title number 2");
        bundle.putString("action", "tip");
        bundle.putString("greek", "somehting else");
        bundle.putInt("action_num", 2);
        notificationIntent.putExtras(bundle);
        alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        contentIntent = PendingIntent.getActivity(Notifications.this, 0, notificationIntent, 0);

        Notification notification = new Notification(icon, tickerText, when);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notification.defaults = Notification.DEFAULT_ALL;

        mNotificationManager.notify(UniqueID, notification);

        int hour = tp.getCurrentHour();
        int minutes = tp.getCurrentMinute();

        contentIntent = PendingIntent.getService(Notifications.this, 0, notificationIntent, 0);
        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minutes);
        calendar.set(Calendar.SECOND, 00);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent);

but no luckk...

any help please?

回答1:

Use alarm manager and put your notification in NotifyService class

Intent myIntent = new Intent(Current.this , NotifyService.class);     
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
pendingIntent = PendingIntent.getService(ThisApp.this, 0, myIntent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 00);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent);  //set repeating every 24 hours


回答2:

I know this is an old question but I had a similar requirement and this is what I did. I found the difference between the current system time and the intended time for sending notification in millis and implemented a runnable inside an android service. The below code will come in the Notifyservice.

private Handler notificationTimer = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what==0) {
                sendNotifications();
        }
        super.handleMessage(msg);
    }
};
private Runnable notificationCaller = new Runnable() {

    @Override
    public void run() {
        Message msg = notificationTimer.obtainMessage();
        msg.what = 0;
        notificationTimer.sendMessage(msg);
    }
};        


    Calendar calendar = Calendar.getInstance();
    Calendar timefornotification = Calendar.getInstance();
    timefornotification.set(Calendar.HOUR_OF_DAY, 12);
    timefornotification.set(Calendar.MINUTE, 30);
    timefornotification.set(Calendar.SECOND, 00);

    Long difference = calendar.getTimeInMillis() - timefornotification.getTimeInMillis();

    if(difference<0){
        notificationTimer.postDelayed(notificationCaller, -(difference));
    }
    else{
        notificationTimer.postDelayed(notificationCaller, difference);
    }

   public void sendNotifications(){
        ------Your code here-------
        notificationTimer.removeCallbacksAndMessages(null);
        notificationTimer.postDelayed(notificationCaller, 86400000);
        ------86400000 is one day. So it will repeat everyday-------
   }

You can then call a service from main class to run this in background.

   Intent service = new Intent(this, NotifyService.class);
    this.startService(service);