我目前有一个运行正常的服务,但是当我尝试使用stopService方法停止它时,它的onDestroy方法不会被调用。
以下是我用来尝试停止服务的代码
stop_Scan_Button =(Button)findViewById(R.id.stopScanButton);
stop_Scan_Button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Log.d("DEBUGSERVICE", "Stop Button pressed");
Intent service = new Intent(CiceroEngine. CICERO_SERVICE);
releaseBind();
Log.d("Stop_Scan_Button", "Service: " + service.toString());
stopService(service);
Log.d("Stop_Scan_Button", "Service should stop! ");
}
});
我是否正确地认为当使用stopService时它会调用服务的onDestroy方法?当我按下停止扫描按钮时,我的服务中的onDestroy()
方法不会被调用。
我还缺少其他任何我应该停止服务的内容吗?
编辑:要在运行stopService而不是onServiceConnected()
时调用onServiceDisconnected()
,为什么会发生这种情况?
编辑:添加更多关于绑定的信息
我在onCreate()方法中调用bindService,然后让releaseBind()方法取消绑定服务。
以下是该方法的代码:
public void releaseBind(){
unbindService(this);
}
所以我认为解除绑定不是我的问题?
答案 0 :(得分:43)
我猜你有releaseBind()
方法调用意味着您之前曾在此服务上调用bindService()
而releaseBind()
正在调用unbindService()
。如果我的猜测不正确,请忽略此答案。
在所有bindService()
个来电都有相应的unbindService()
来电后,服务会关闭。如果没有绑定的客户端,那么当且仅当有人在服务上调用stopService()
时,该服务还需要startService()
。
所以,这里有一些可能性:
unbindService()
和stopService()
都是异步的,因此可能会因时间问题而陷入困境,如果您从{{1}调用stopService()
,您可能会获得更好的运气} ServiceConnection
方法另外,请记住,服务被销毁的确切时间取决于Android,可能不会立即生效。因此,例如,如果您依靠onServiceDisconnected()
使您的服务停止正在完成的某项工作,请考虑使用另一个触发器(例如,通过服务绑定器调用onDestroy()
方法的活动接口)。
答案 1 :(得分:10)
您的所有绑定都已关闭吗?
A service can be used in two ways.这两种模式不是 完全 分离。您可以绑定到服务 那是从startService()开始的。 例如,背景音乐 可以通过调用来启动服务 带有Intent对象的startService() 识别要播放的音乐。 只有在以后,可能是用户 想要控制一下 玩家或获取有关的信息 当前的歌,将是一项活动 建立与服务的连接 通过调用bindService()。在案件 像这样,stopService()不会 实际上停止服务直到 最后一个绑定已关闭
答案 2 :(得分:4)
public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
Log.d(TAG, "onClick: starting srvice");
startService(new Intent(this, MyService.class));
break;
case R.id.buttonStop:
Log.d(TAG, "onClick: stopping srvice");
stopService(new Intent(this, MyService.class));
break;
}
}
并在服务类中:
public class MyService extends Service {
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
}
}