如何将处理程序从活动传递到服务

时间:2014-03-22 04:03:47

标签: java android service bluetooth handler

如何将处理程序从活动传递到服务?我正在尝试使用Handler更新有关蓝牙连接状态的活动UI,如下所示从服务类。

mHandler.obtainMessage(MenuActivity.MESSAGE_STATE_CHANGE, state, -1).sendToTarget();

在活动中,我实现了这个:

   public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_STATE_CHANGE:
                 if (true)
                     Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
                 switch(msg.arg1){
                    case BluetoothService.STATE_CONNECTED:
                        showToast("Connected to " + mConnectedDeviceName, Toast.LENGTH_SHORT);
                        break;

我尝试使用构造函数将处理程序从活动传递到服务,如下所示:

public BluetoothService(Handler handler, BluetoothAdapter mBluetoothAdapter) {
        mAdapter = mBluetoothAdapter;
        mState = STATE_NONE;
        mHandler = handler;
}

但是有一个错误显示无法实例化服务并发现服务需要有一个公共的无参数构造函数。但是在删除构造函数之后,处理程序没有被传递到服务中。

如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

您必须从活动绑定到服务并建立ServiceConnection,然后获取服务实例并设置您的处理程序。

以下是我用于其中一个媒体播放器应用程序的活动和服务类.....

public class MainActivity extends Activity
{
private CustomService mService = null;

private boolean mIsBound;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    startService(new Intent(this.getBaseContext(), CustomService.class));
    doBindService();
}


private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder)
    {
        mService = ((CustomService.LocalBinder)iBinder).getInstance();
        mService.setHandler(yourHandler);
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName)
    {
        mService = null;
    }
};

private void doBindService()
{
    // Establish a connection with the service.  We use an explicit
    // class name because we want a specific service implementation that
    // we know will be running in our own process (and thus won't be
    // supporting component replacement by other applications).
    bindService(new Intent(this,
            CustomService.class), mConnection, Context.BIND_AUTO_CREATE);
    mIsBound = true;
}

private void doUnbindService()
{
    if (mIsBound)
    {
        // Detach our existing connection.
        unbindService(mConnection);
        mIsBound = false;
    }
}

@Override
protected void onDestroy()
{
    super.onDestroy();
    doUnbindService();
}

}

CustomService Code ....

public class CustomService extends Service
{
private final IBinder mIBinder = new LocalBinder();

private Handler mHandler = null;

@Override
public void onCreate()
{
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flag, int startId)
{
    return START_STICKY;
}

@Override
public void onDestroy()
{
    if(mHandler != null)
    {
        mHandler = null;
    }
}

@Override
public IBinder onBind(Intent intent)
{
    return mIBinder;
}

public class LocalBinder extends Binder
{
    public CustomService getInstance()
    {
        return CustomService.this;
    }
}

public void setHandler(Handler handler)
{ 
   mHandler = handler;
}

}