Service onStop不会停止服务

时间:2016-09-26 18:58:56

标签: android android-service android-broadcastreceiver

我有一项服务,每订购一次活动,每隔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);
}

在我的活动中,我在onResume / onPause方法中注册/启动和取消注册/停止servince。 它们被调用,因此实际执行以下代码:

//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(),服务仍然会运行,当我重新注册我的接收器时,它会被多次调用。

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

我出错了什么?

3 个答案:

答案 0 :(得分:0)

你的问题在这里:

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

首先,您无需在this.stopSelf()内拨打onDestroy(),因为onDestroy()已被停止时会调用Service

其次,对removeCallbacksAndMessages(broadcast)的调用并不会删除您发布到Runnable的{​​{1}}。这就是为什么即使你已经停止了Handler,你仍然会每隔10秒获得一次广播ServiceIntent的参数不是removeCallbacksAndMessages(),而是"令牌" (你没有使用)。

要解决您的问题,请拨打Runnable。此方法将removeCallbacks(broadcast)作为参数,并将从Runnable中移除已发布的Runnable(这是您要执行的操作)。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

你的所有绑定都关闭了吗?

可以通过两种方式使用服务。您可以绑定到使用startService()启动的服务。例如,可以通过使用Intent对象调用startService()来启动后台服务,该对象标识要执行的下载。只有在以后,可能当用户想要对该下载进行一些控制或获取有关下载的信息时,活动是否会通过调用bindService()建立与服务的连接。在这种情况下,stopService()实际上不会在最后一个绑定关闭之前停止服务。

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

所以,这里有一些可能性:

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

2)由于unbindService()和stopService()都是异步的,因此可能会随着时间的推移而变得混乱,在这种情况下,如果从ServiceConnection的onServiceDisconnected()方法调用stopService(),可能会获得更好的运气。

另外,请记住,服务被破坏的确切时间取决于android os,可能不会立即生效。因此,例如,如果您依赖onDestroy()使您的服务停止正在完成的某些工作,请考虑使用另一个触发器(例如,通过服务绑定器接口调用stopDoingStuff()方法的活动)。 / p>