Android Java : 如何在 App 不在前台时完全删除 ScheduledExecutorService 实例

Android Java : How to completely remove instance of ScheduledExecutorService when App is not in foreground

我有以下循环检查上次查看的代码块,我想从 运行 停止它,并在应用程序不再位于前台时释放资源。

对于以下内容,runnable 不会停止,它会继续。

ScheduledFuture<?> dfgh;

   private void getLastSeen() {
      AsyncTask.execute(new Runnable() {
         @Override
         public void run() {
            ScheduledExecutorService scheduleTaskExecutor = Executors.newSingleThreadScheduledExecutor();
            dfgh = scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
               public void run() {
                  if (!Presence.screenLocked(A) && Presence.inForeground(A)) {
                     MessageHelper.getLastSeen(RECIPIENT, A);
                     System.out.println("Checking Presence");
                  } else {
                     System.out.println("App not in foreground or screen is locked");
                     dfgh.cancel(true);
 //cancel here doesn't seem to cancel.
                  }
               }
            }, 0, 2, TimeUnit.SECONDS);
         }
      });
   }

因为 ScheduledExecutorService 的范围是 run 的本地范围,所以您将无法通过其他方法控制它。

如果你看到 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html you will see that they have their instance as a field. On this field you can call shutdownNow