简体   繁体   English

如何从自己的前台通知中停止服务

[英]How to stop service from its own foreground notification

I have a Service running.我有一个Service正在运行。 and in its onStartCommand I am doing startforeground to avoid killing by system.在它的onStartCommand我正在做startforeground以避免被系统杀死。

public int onStartCommand(Intent intent, int flags, int startId) {
    if (ACTION_STOP_SERVICE.equals(intent.getAction())) {
        Log.d(TAG,"called to cancel service");
        manager.cancel(NOTIFCATION_ID);
        stopSelf();
    }
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("abc");
    builder.setContentText("Press below button to stoP.");
    builder.setPriority(NotificationCompat.PRIORITY_HIGH);
    builder.setSmallIcon(R.drawable.ic_launcher);

    Intent stopSelf = new Intent(this, SameService.class);
    stopSelf.setAction(this.ACTION_STOP_SERVICE);
    PendingIntent pStopSelf = PendingIntent.getService(this, 0, stopSelf,0);
    builder.addAction(R.drawable.ic_launcher, "Stop", pStopSelf);
    manager.notify(NOTIFCATION_ID, builder.build());
}

but after pressing button , PendingIntent is not working and my activity is not getting stopped by it.但是按下按钮后, PendingIntent不起作用,我的activity也没有被它阻止。

Can someone please tell, what wrong am I doing here or any other solution to stop service from the foreground notification made by self.有人可以告诉我,我在这里做错了什么或任何其他解决方案来停止自我notification的前台notification服务。

Thanks谢谢

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 .这 0 到底是问题的原因。 I have replaced this with PendingIntent.FLAG_CANCEL_CURRENT and it worked now.我已经用 PendingIntent.FLAG_CANCEL_CURRENT 替换了它,现在它可以工作了。

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.请检查FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT以获得更多解释。

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.您应该在循环/计算方法中放置一些标志并调用“ return; ”,然后您可以通过stopself()停止服务或等到它自行完成。 If need example I can show.如果需要示例,我可以展示。 So please ask.所以请问。

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如果您正在使用该服务,则该服务无法自行停止其在后台运行您必须在此代码中停止该服务 m 在通知按钮上停止该服务单击它对我有用.. 请试试这个

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();
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM