How to stop service from its own foreground notification

if u are using the Service then the service can not stop by itself its runs in the background u have to stop that in this code m stoping the service on notification button click it works for me.. Please Try this

public class AlarmSoundService extends Service {
    public static final int NOTIFICATION_ID = 1;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public int onStartCommand(final Intent intent, int flags, int startId) {
        if (intent != null) {
            if (intent.getAction().equals(Constants.ACTION_START)) {
                final Handler handler = new Handler();
                Timer timer = new Timer();
                TimerTask doAsynchronousTask = new TimerTask() {
                    @Override
                    public void run() {
                        handler.post(new Runnable() {
                            public void run() {
                                try {
                                    Date date = new Date();
                                    List<Event> list = SharedPref.getInstance(getApplicationContext()).getEvents();
                                    for (int i = 0; i < list.size(); i++) {
                                        Event a = list.get(i);
                                        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yy", Locale.getDefault());
                                        String currentDate = format.format(date);
                                        if (a.getDate().equals(currentDate)) {
                                            date = new Date();
                                            format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH);
                                            if (a.getTime().equals(format.format(date))) {
                                                playAlarmNotification(a.getTitle(), a.getDescription());
                                            }
                                        }
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                };
                timer.schedule(doAsynchronousTask, 0, 1000);
            } else if (intent.getAction().equals(Constants.ACTION_STOP)) {
                stopForegroundService();
            }
        }
        return START_STICKY;
    }

    public void playAlarmNotification(String Title, String Description) {

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent stopnotificationIntent = new Intent(this, AlarmSoundService.class);
        stopnotificationIntent.setAction(Constants.ACTION_STOP);
        PendingIntent Intent = PendingIntent.getService(this, 0, stopnotificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel_id")
                .setSmallIcon(R.drawable.ic_access_time_black_24dp)
                .setContentTitle(Title)
                .setContentText(Description)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setColor(Color.BLUE)
                .setDefaults(Notification.DEFAULT_ALL)
                .setFullScreenIntent(pendingIntent, true)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .addAction(android.R.drawable.ic_media_pause, "Stop", Intent);


        Notification notification = builder.build();

        if (Build.VERSION.SDK_INT >= 26) {
            NotificationChannel channel = new NotificationChannel("channel_id", "background_service", NotificationManager.IMPORTANCE_DEFAULT);
            channel.setDescription("hello");
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }
        startForeground(NOTIFICATION_ID, notification);
    }

    private void stopForegroundService() {

        stopForeground(true);
        stopSelf();
    }

}

Answering my own question for sake of other finders like me.

Problem was in the line below

 PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);

This 0 in the end was cause of the problem . I have replaced this with PendingIntent.FLAG_CANCEL_CURRENT and it worked now.

The corrected code is :

PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,PendingIntent.FLAG_CANCEL_CURRENT);

Please check FLAG_CANCEL_CURRENT or FLAG_UPDATE_CURRENT for more explanation.


The above idea will not work properly. Service should stop it's thread first, so sometimes You'l see strange behavior. You should put some flag inside your loop/computation method and call "return;" , and than You may stop service by stopself() or just wait untill it finish itself. If need example I can show. So please ask.