How To give notifications on android on specific time?

前端 未结 4 560
傲寒
傲寒 2020-12-02 09:10

I want to give notification to my app on a specific time. Say everyday i have to give notification on 7 AM even if the app is closed.

How can i do this? Any tutorial

4条回答
  •  囚心锁ツ
    2020-12-02 09:47

    • Get the Alarm service from the system.
    • Make a pending intent, passing in the broadcast receiver class's name.
    • Make a calendar object and set the time of it too 8 am.
    • Check if the current time is past 8. If yes then add another day to it.
    • Call the set repeating method of AlarmManager class.

    Sample code for the same:

    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);   
    alarmIntent = new Intent(context of current file, AlarmReceiver1.class); 
    AlarmReceiver1 = broadcast receiver
    
        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:

    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) {
    Context 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.");
    
    }
    
    }
    

提交回复
热议问题