【问题标题】:How to stop service from its own foreground notification如何从自己的前台通知停止服务
【发布时间】:2015-05-24 10:26:06
【问题描述】:

我有一个Service 正在运行。在其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());
}

但按下按钮后,PendingIntent 不起作用,我的activity 也没有被它阻止。

谁能告诉我,我在这里做错了什么或任何其他解决方案从前台停止服务notification 自己制作。

谢谢

【问题讨论】:

    标签: android service notifications kill


    【解决方案1】:

    为了像我这样的其他发现者,回答我自己的问题。

    问题出在下面一行

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

    这个0到底是问题的原因。 我已经用 PendingIntent.FLAG_CANCEL_CURRENT 替换了它,它现在可以工作了。

    更正后的代码是:

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

    更多解释请查看FLAG_CANCEL_CURRENT or FLAG_UPDATE_CURRENT

    【讨论】:

      【解决方案2】:

      上述想法将无法正常工作。服务应该首先停止它的线程,所以有时你会看到奇怪的行为。您应该在循环/计算方法中放置一些标志并调用 "return;" ,然后您可以通过 stopself() 停止服务或等待它自己完成。如果需要示例,我可以展示。所以请教。

      【讨论】:

      • 我要例子
      【解决方案3】:

      如果您正在使用该服务,则该服务无法自行停止它在后台运行,您必须在此代码中停止该服务 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();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多