我有一项服务,每订购一次活动,每隔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解决方案但是......没办法。
我出错了什么?
答案 0 :(得分:0)
你的问题在这里:
public void onDestroy() {
super.onDestroy();
this.stopSelf();
handler.removeCallbacksAndMessages(broadcast);
}
首先,您无需在this.stopSelf()
内拨打onDestroy()
,因为onDestroy()
已被停止时会调用Service
。
其次,对removeCallbacksAndMessages(broadcast)
的调用并不会删除您发布到Runnable
的{{1}}。这就是为什么即使你已经停止了Handler
,你仍然会每隔10秒获得一次广播Service
。 Intent
的参数不是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>