2015-06-21 60 views
-1

我在Service中有BroadcastReceiver当广播接收机在服务中注册时无法停止服务

我注册服务的oncreate()方法类似接收器,

final MyReceiver myReceiver = new MyReceiver(); 
@Override 
public void onCreate() { 
    IntentFilter filter = new IntentFilter(SOME_FILTER); 
    registerReceiver(myReceiver, filter); 
} 

然后我创建注销接收器和停止服务等的方法,

public void stopService(){ 
    if(myReceiver != null){ 
     try{ 
      unregisterReceiver(myReceiver); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    stopSelf(); 
} 

不会停止的服务。有也不例外,没有错误。只是服务不会停止。

我也试了一下下面的方式,

public void stopService(){ 
    if(myReceiver != null){ 
     try{ 
      unregisterReceiver(myReceiver); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    stopForeground(true); 
    stopSelf(); 
} 

通过这种服务的通知被在前台运行皮,但服务的onDestroy()不会被调用。

我也试图把代码注销接收机onDestroy()但调用stopSelf()方法onDestroy()永远不会被调用后。

如果我没有在注册该服务的BroadcastReceiver,一切工作完全正常,服务站和onDestroy()被调用,但是当我注册receiver那么它不会停止。

任何想法这里发生了什么?

编辑

这是怎么了绑定和启动服务

Intent serviceIntent = new Intent(MainActivity.this, MyService.class); 
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE); 
startService(serviceIntent); 

这是mConnection

MyService myService; 

private ServiceConnection mConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName className, IBinder service){ 
     LocalBinder binder = (LocalBinder) service; 
     myService = binder.getService(); 
     isBound = true; 
    } 
    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     isBound = false; 
    } 
}; 

下面是我是怎么解除绑定服务,并停止它。

if(isBound){ 
    unbindService(mConnection); 
    isBound = false; 
} 

myService.stopService(); 
myService = null; 
+0

如何启动'Service'并在哪里调用'stopService()'(btw不是一个好名字,因为'ContextWrapper'中有一个类似于不同参数的方法)。另外,你是否在任何地方绑定了“服务”? –

+0

@ci_我已将代码添加到问题中。 – gprathour

+0

你正在提供不完整的代码,什么是playerService?你为什么不发布一个工作的客户和服务代码? – pskink

回答

0

刚刚通过命中和试用方法找到了相同的解决方案。

我将代码转换为unregisterreceiveronDestroy()方法并且全部正常工作。

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(myReceiver != null){ 
     try{ 
      unregisterReceiver(myReceiver); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

我想问题出现了,因为我正试图在停止服务之前取消注册接收器。

0

虽然Service被绑定,就永远不会被破坏。

http://developer.android.com/reference/android/app/Service.html

服务可以同时起步,并没有绑定到它的连接。在这种情况下,只要系统启动,或者存在与Context.BIND_AUTO_CREATE标志的一个或多个连接,系统就会继续运行该服务。一旦这些情况都不成立,就会调用服务的onDestroy()方法,并且服务被有效终止。从onDestroy()返回后,所有清理(停止线程,取消注册接收者)应该完成。

虽然这是完全可以拥有一个Service既,约束,并开始,它使玄乎的生命周期管理问题(如你刚刚发现)。如果可能,您应该决定是否需要松散或紧密耦合您的Service,然后分别使用开始或绑定Service。这会让你的生活更轻松。

+0

我首先解除连接,然后停止服务,查看我更新的问题。和**一切工作正常,如果我只是删除'BroadcastReceiver' **。 – gprathour