Service onStop 不会停止服务

Service onStop does not stop the service

我有一项服务,每 activity 个订阅者每 10 秒 ping 一次。 这是我的服务定义:

public class MyService extends Service {

private final static String TAG = "AccountSummaryService";
public static final String BROADCAST_ACTION = "com.mypackage.mobile";
private Handler handler = new Handler();
private final int delayedStartupTime = 1000;
private Intent intent;

@Override
public void onCreate() {
    super.onCreate();
    intent = new Intent(BROADCAST_ACTION);
}

@Override
public int onStartCommand(Intent intent, int flags,  int startId) {
    handler.postDelayed(broadcast, 1000);
    return START_STICKY;
}

private Runnable broadcast = new Runnable() {
    @Override
    public void run() {
        sendBroadcast(intent);
        handler.postDelayed(this, 10000);
    }
};

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

@Override
public void onDestroy() {
    super.onDestroy();
    this.stopSelf();
    handler.removeCallbacksAndMessages(broadcast);
}

在我的 activity 我 register/start 和 unregister/stop 我的 onResume/onPause 方法中的服务。 它们被调用以便实际执行以下代码:

//in the onCreate
Intent anIntent = new Intent(activity, MyService.class);

@Override
public void onResume() {
    super.onResume();
    startSummaryRefreshService();
}

@Override
public void onPause() {
    super.onPause();
    stopSummaryRefreshService();
}

private void startSummaryRefreshService() {
    activity.startService(anIntent);
    activity.registerReceiver(myReceiverObject, new IntentFilter(RefreshUIService.BROADCAST_ACTION));
}

public void stopSummaryRefreshService() {
    activity.unregisterReceiver(myReceiverObject);
    activity.stopService(anIntent);
}

问题是即使调用了 stopService() 服务仍然运行,当我重新注册我的接收器时它被调用了多次。

基本上...无论如何我都无法停止服务。我一直在尝试许多 Whosebug 解决方案,但...没办法。

我哪里弄错了?

你的 all binding closed 了吗?

一个服务可以有两种使用方式。您可以绑定到使用 startService() 启动的服务。例如,可以通过使用标识要执行的下载的 Intent 对象调用 startService() 来启动后台服务。只是后来,os可能当用户想要对该下载进行某种控制或获取有关下载的信息时,activity 才会通过调用 bindService() 建立与该服务的连接。在这种情况下,直到最后一个绑定被 closed.

时,stopService() 才会真正停止服务

在所有 bindService() 调用都进行了相应的 unbindService() 调用后,服务将关闭。如果没有绑定的客户端,那么当且仅当有人在服务上调用了 startService() 时,服务也将需要 stopService()。

所以,这里有一些 pos优点:

1)您仍然有绑定的客户端(例如,其他活动),在这种情况下,在他们解除绑定之前您无法停止服务

2) 由于 unbindService() 和 stopService() 都是异步的,某些事情可能会随着时间的推移而失控,在这种情况下,如果您从 ServiceConnection 的 onServiceDisconnected() 方法调用 stopService() 可能会好运。

另外,请记住,服务被销毁的确切时间是 android os 并且可能不是立即的。因此,例如,如果您依赖 onDestroy() 使您的服务停止某些正在完成的工作,请考虑为此使用另一个触发器(例如,activity 通过服务绑定器调用 stopDoingStuff() 方法接口)。

你的问题在这里:

public void onDestroy() {
    super.onDestroy();
    this.stopSelf();
    handler.removeCallbacksAndMessages(broadcast);
}

首先,您不需要从 onDestroy() 中调用 this.stopSelf(),因为 onDestroy() 是在 Service 已经停止时调用的。

其次,调用 removeCallbacksAndMessages(broadcast) 不会删除您发布到 HandlerRunnable。这就是为什么即使在您停止 Service 之后,您仍然每 10 秒收到一次广播 IntentremoveCallbacksAndMessages() 的参数不是 Runnable,而是 "token"(您没有使用)。

要解决您的问题,只需调用 removeCallbacks(broadcast)。此方法将 Runnable 作为参数,并将从 Handler 中删除已发布的 Runnable(这是您想要执行的操作)。

谢谢大家的回答。问题是计时器。 onDestroy() 被正确调用,但我定义循环的方式创建了一个无限循环,因为可运行对象本身是一个对象,与服务分离(它实际上被 onDestroy() 杀死,并且每 10 次重新创建一次秒一次开始。