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)
不会删除您发布到 Handler
的 Runnable
。这就是为什么即使在您停止 Service
之后,您仍然每 10 秒收到一次广播 Intent
。 removeCallbacksAndMessages()
的参数不是 Runnable
,而是 "token"(您没有使用)。
要解决您的问题,只需调用 removeCallbacks(broadcast)
。此方法将 Runnable
作为参数,并将从 Handler
中删除已发布的 Runnable
(这是您想要执行的操作)。
谢谢大家的回答。问题是计时器。 onDestroy()
被正确调用,但我定义循环的方式创建了一个无限循环,因为可运行对象本身是一个对象,与服务分离(它实际上被 onDestroy()
杀死,并且每 10 次重新创建一次秒一次开始。
我有一项服务,每 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)
不会删除您发布到 Handler
的 Runnable
。这就是为什么即使在您停止 Service
之后,您仍然每 10 秒收到一次广播 Intent
。 removeCallbacksAndMessages()
的参数不是 Runnable
,而是 "token"(您没有使用)。
要解决您的问题,只需调用 removeCallbacks(broadcast)
。此方法将 Runnable
作为参数,并将从 Handler
中删除已发布的 Runnable
(这是您想要执行的操作)。
谢谢大家的回答。问题是计时器。 onDestroy()
被正确调用,但我定义循环的方式创建了一个无限循环,因为可运行对象本身是一个对象,与服务分离(它实际上被 onDestroy()
杀死,并且每 10 次重新创建一次秒一次开始。