使用DeadObjectException在onRebind()之后Android服务失败

时间:2012-08-27 21:07:19

标签: android service

我的Android服务和重新绑定的客户端应用程序出现问题。当客户端应用程序最初绑定到我的服务时,一切正常,之后消息可以从服务发送到客户端。但是,如果客户端应用程序被终止然后再次绑定,则在服务中正确调用onRebind(),但我在intent中的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);

1 个答案:

答案 0 :(得分:0)

绑定服务有note ...附加说明下的部分应该是有用的。我认为捕获异常可能就是你应该做的......

try {
    // Do stuff
} catch(DeadObjectException e){
    // Dead object
}

我读到对象的生命周期应该是android跨进程计算的引用,所以你应该没问题,当客户端死了我想知道是否

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

我认为正在发生的事情是你对服务的绑定,它将一些数据泵回你的客户端,你的客户端消失了,服务继续运行但是然后需要将一些数据泵送到客户端走了这一步?

link