How to show a notification everyday at a certain time even when the app is closed?

前端 未结 3 436
温柔的废话
温柔的废话 2021-02-04 10:52

Although this question might have been asked before on Stack Overflow, I still haven\'t found a clear answer.

I want to show a notification everyday at 12pm for example

相关标签:
3条回答
  • 2021-02-04 10:59

    This is updated solution, and it works Android Oreo

    Step 1: Create a Method in your MainActivity and use AlarmManager to set alarm at a specified time.

    public void myAlarm() {
      
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 21);
        calendar.set(Calendar.MINUTE, 47);
        calendar.set(Calendar.SECOND, 0);
        
        if (calendar.getTime().compareTo(new Date()) < 0) 
            calendar.add(Calendar.DAY_OF_MONTH, 1);
    
        Intent intent = new Intent(getApplicationContext(), NotificationReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        
        if (alarmManager != null) {
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
    
      }
      
    }
    

    I'm setting my alarm at 09:47 PM

    Step 2: Create BroadcastReceiver to listen when the alarm happens

    public class NotificationReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        NotificationHelper notificationHelper = new NotificationHelper(context);
        notificationHelper.createNotification();
    
       }
    }
    

    I'm creating this class named NotificationReceiver and extends BroadcastReceiver, in onReceive there is Class named NotificationHelper, don't confuse I will explain this Class for next steps.

    Step 3: Create the Notification class

    class NotificationHelper {
    
    private Context mContext;
    private static final String NOTIFICATION_CHANNEL_ID = "10001";
    
    NotificationHelper(Context context) {
        mContext = context;
    }
    
    void createNotification()
    {
       
        Intent intent = new Intent(mContext , NotificationActivity.class);
       
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
        PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
                0 /* Request code */, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    
    
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID);
        mBuilder.setSmallIcon(R.mipmap.ic_launcher);
        mBuilder.setContentTitle("Title")
                .setContentText("Content")
                .setAutoCancel(false)
                .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
                .setContentIntent(resultPendingIntent);
    
        NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
        {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.enableVibration(true);
            notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            assert mNotificationManager != null;
            mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
            mNotificationManager.createNotificationChannel(notificationChannel);
        }
        assert mNotificationManager != null;
        mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
           }
         }
    

    This class handles the notification

    Step 4: Come back to Step 2: and call the Notification Class

     NotificationHelper notificationHelper = new NotificationHelper(context);
     notificationHelper.createNotification();
    

    Registering a BroadcastReceiver Go to your Androidmanifest file and register your broadcast receiver

    <receiver
        android:name=".NotificationReceiver"></receiver>
    

    For more info refer this guide from google

    I hope it helps you.

    0 讨论(0)
  • 2021-02-04 11:16

    If I understood you correctly, I believe that you need setup a recurring alarm using AlarmManager. You also need to setup starting alarm service on device reboot. You can write a method that does what you want so it get executed when the alarm runs e.g. show notification. The following links should help you:

    • Android Fundamentals: Scheduling Recurring Tasks
    • Repeat Alarm Example In Android Using AlarmManager
    0 讨论(0)
  • 2021-02-04 11:19
    **After Working for a Longer time I want that everyOne should not Waste time so Kindly Approve My ANswer So it will be helpfull for Other developer** 
    
    1-  First Step Create a method which contains your Code where you will define your Time or at what time you want to show the notification.This method need to be called from where you want user to ask for notification.
    
     public void getNotification () {
    
    
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    
    
               Intent intent = new Intent(getApplicationContext(), Notification_receiver.class);
    
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
    
                alarmManager.cancel(pendingIntent);
    
                Calendar calendar = Calendar.getInstance();
                Calendar now = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, 16);
                calendar.set(Calendar.MINUTE, 30);
                calendar.set(Calendar.SECOND, 00);
                if (now.after(calendar)) {
                    Log.d("Hey","Added a day");
                    calendar.add(Calendar.DATE, 1);
                }
    
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
            }
    
    
    2- Create a Notification_receiver class which is going to extend Broadcast Receiver here you are going to define your **Channel Id** as it is perfectly working for **API 25 and above** this the Notification_receiver class:
    
    
    
    import android.app.Notification;
    import android.app.NotificationChannel;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.BitmapFactory;
    import android.media.RingtoneManager;
    import android.net.Uri;
    import android.os.Build;
    import android.util.Log;
    
    import androidx.core.app.NotificationCompat;
    
    //Created By Prabhat Dwivedi
    public class Notification_receiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationCompat.Builder builder;
            PendingIntent pendingIntent;
    
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel("Your App Name",
                        "You app Package Name",
                        NotificationManager.IMPORTANCE_HIGH);
                String channel_Id = channel.getId();
                CharSequence channel_name = channel.getName();
                Log.e("Notification_receiver", "channel_Id :" + channel_Id);
                Log.e("channel_name", "channel_name :" + channel_name);
    
                channel.setDescription("Make entry of today's spending now");
                notificationManager.createNotificationChannel(channel);
            }
    
            builder = new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.yourapp_logo)
                    .setChannelId("Your app Name is your Channel Id")
                    .setContentTitle("Your title")
                    .setContentText("Your Description")
                    .setAutoCancel(true);
    
    //nder this you will find intent it is going to define after clicking notification which activity you want to redirect
            Intent repeatingIntent = new Intent(context, HomePage.class);
             pendingIntent = PendingIntent.getActivity(context, 100, repeatingIntent,    PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(pendingIntent);
            notificationManager.notify(100, builder.build());
        }
        }
    
    0 讨论(0)
提交回复
热议问题