6

我有几个Service要绑定到的Android Activity,因此我可以监视用户的多个操作。

为了能够绑定每个服务,并且我将拥有几个,ServiceConnection我的活动中是否需要几个 private ,如下所示?

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        GPSLocalBinder gpsBinder = (GPSLocalBinder) service;
        PhotoLocalBinder photoBinder = (PhotoLocalBinder) service;
        gpsService = gpsBinder.getService();
        photoService = photoBinder.getService();
        mGpsBound = true;
        mPhotoBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mGpsBound = false;
        mPhotoBound = false;
    }
};

或者我是否需要在我的 Activity 和服务之间提供一个管理器类,以便更好地使用和理解有界服务?

4

2 回答 2

1

每个android服务都需要一个serviceConnection吗?

我假设您在问是否可以serviceConnection为多个服务重复使用相同的内容。没有必要为每个服务连接设置一个,但这可能是最好的方法。我在你的代码中看到了这个

        GPSLocalBinder gpsBinder = (GPSLocalBinder) service;
        PhotoLocalBinder photoBinder = (PhotoLocalBinder) service;
        gpsService = gpsBinder.getService();
        photoService = photoBinder.getService();

这非常令人困惑......这似乎可以将一个服务转换为两个不同的服务!

你会意识到onServiceConnected回调是大部分魔法发生的地方,你(Activity)最终可以获得指向你的服务的指针并开始调用方法并与你的服务交互。如果您想serviceConnection为不同的服务重用相同的内容,您需要找出 IBinder 对象属于哪个自定义子类,然后进行适当的转换。咳咳,太麻烦了。我建议serviceConnection每项服务都有一个。

或者我是否需要在我的活动和服务之间建立一个管理器类,以便更好地使用和理解有界服务?

对于这个问题和你的第一个问题,你可以做任何你想做的事情。没有比其他方法更好的方法(恕我直言),最好的方法是您更了解并让您感觉更舒服的方法。

于 2014-03-07T17:39:46.727 回答
0

单个ServiceConnection实例可用于绑定到多个服务。

ServiceConnection.onServiceConnected()中,您必须检查绑定了哪个服务(使用className.getClassName()or className.getPackageName())并将其放在适当的字段/变量等中。

我使用这个线程作为参考,虽然我修改它以满足我的需要。

private static final int SERVICE_1_INDEX = 0;
private static final int SERVICE_2_INDEX = 1;

/** Array of the subclasses of {@link BaseService}s which have been bound */
private BaseService[] mServices;
/** ServiceConnection which handles the binding/unbinding of the services */
private MyServiceConnection mServiceConnection;

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mServiceConnection = new MyServiceConnection();
}

@Override
public void onResume() {
    super.onResume();
    bindServices();
}

@Override
public void onPause() {
    super.onPause();
    unbindServices();
}

private void bindServices() {
    Intent service1Intent = new Intent(getActivity().getApplicationContext(), MyService1.class);
    Intent service2Intent = new Intent(getActivity().getApplicationContext(), MyService2.class);

    getContext().bindService(service1Intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    getContext().bindService(service2Intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

private void unbindServices() {
    if (mServiceConnection != null) {
        getContext().unbindService(mServiceConnection);
    }
}

private class MyServiceConnection implements ServiceConnection {
    public void onServiceConnected(ComponentName className, IBinder boundService ) {
        Log.d("className(bound)", className.getClassName());
        Log.d("className(Service1)", MyService1.class.getName());
        Log.d("className(Service2)", MyService2.class.getName());
        BaseService.LocalBinder binder = (BaseService.LocalBinder) boundService;
        if (className.getClassName().equals(MyService1.class.getName())) {
            mServices[SERVICE_1_INDEX] = binder.getService();
            // call method on your service like:
            // binder.getService().someMethod();
            // (you may need to cast to your actual Service)
        }
        else {
            mBaseServices[SERVICE_2_INDEX] = binder.getService();
            // call method on the service like in if-block
        }
    }

    public void onServiceDisconnected(ComponentName className) {
        if (className.getClassName().equals(MyService1.class.getName())) {
            mBaseServices[SERVICE_1_INDEX] = null;
        }
        else {
            mBaseServices[SERVICE_2_INDEX] = null;
        }
    }
}
于 2016-10-31T11:17:21.347 回答