Android服务在onRebind()之后失败,出现DeadObjectException

Android服务在onRebind()之后失败,出现DeadObjectException,android,service,Android,Service,我的Android服务和重新绑定到它的客户端应用程序有问题。当客户端应用程序最初绑定到我的服务时,一切正常,之后可以从服务向客户端发送消息。但是,如果客户端应用程序被终止,然后重新绑定,则会在服务中正确调用onRebind(),但intent中的my messenger无效,导致DeadObjectException,如下面的代码所述。有什么想法吗 以下是我的服务代码: @Override public IBinder onBind(Intent intent) { ge

我的Android服务和重新绑定到它的客户端应用程序有问题。当客户端应用程序最初绑定到我的服务时,一切正常,之后可以从服务向客户端发送消息。但是,如果客户端应用程序被终止,然后重新绑定,则会在服务中正确调用onRebind(),但intent中的my messenger无效,导致DeadObjectException,如下面的代码所述。有什么想法吗

以下是我的服务代码:

@Override
public IBinder onBind(Intent intent)
{        
    getMessenger(intent);

    return _inputMessenger.getBinder();
}

@Override
public void onRebind(Intent intent)
{        
    getMessenger(intent);
}

@Override
public boolean onUnbind(Intent intent)
{                
    return true;
}

private void getMessenger(Intent intent)
{
    Bundle extras = intent.getExtras();

    if (extras != null)
    {
        // Get the messenger sent from the app.
        // This is handled correctly after onBind() and onRebind().
        _outputMessenger = (Messenger) extras.get("MESSENGER"); 
        Log.i(TAG, "Got messenger from app: " + _outputMessenger);           
    }
}

private void sendMessageToClient(String key, String value)
{   
    Message message = Message.obtain();
    Bundle bundle = new Bundle();
    bundle.putString(key, value);
    message.setData(bundle);

    try
    {
        _outputMessenger.send(message); // EXCEPTION OCCURS HERE AFTER onRebind()
    }
    catch (Exception ex)
    {
        Log.e(TAG, "_outputMessenger.send() failed: " + ex);
    }
}
下面是应用程序的代码:

     Intent intent = new Intent("com.foobar.service");

    // Create a new messenger for the communication from service to app.
    _messenger = new Messenger(new ServiceToActivityHandler());
    intent.putExtra("MESSENGER", _messenger);

    _serviceConnection = new MyServiceConnection();

    _isBoundToService = _context.bindService(intent, 
                                           _serviceConnection, 
                                           Context.BIND_AUTO_CREATE);
有一个关于绑定服务的。。。附加注释下的部分应该有用。我认为捕获异常可能是您应该做的

try {
    // Do stuff
} catch(DeadObjectException e){
    // Dead object
}
我读到,对象生命周期应该由android跨进程进行引用计数,所以你应该没事,当客户端死亡时,我想知道

 _outputMessenger // needs to be unassigned in your service...?

我假设发生的情况是,您与服务的绑定,它将一些数据泵送回您的客户机,您的客户机离开,服务继续运行,但随后需要将一些数据泵送到客户机,而客户机现在已经离开了


此外,这里intent的定义是intent intent=new intent(…)?是的,我添加了一个新行来说明这一点。“服务继续运行,但随后需要将一些数据传输到客户端,该客户端已经运行了”。是的,这就是正在发生的事情;该服务正在使用不再有效的messenger。但是onRebind()和我的getMessenger()方法不应该使用一个新的有效messenger吗?我想知道你是否解除了以前messenger的绑定。。。?但我不确定你是否必须。。。您应该能够捕获异常并调试。。。是的,据我所知,你应该能够重新绑定到服务。服务重启(请参阅logcat)s/o主题是否提供了更多信息/起点来帮助您解决……或者,您是否可以不只是通过意图进行通信?这可能会使您的代码更容易…?“但是onRebind()和我的getMessenger()方法不应该使用新的有效messenger吗?”回答:不。onRebind中的意图是从第一个绑定开始的原始意图。你会得到同样的老信使。