5

我有一个在后台运行的网络服务。我mConnection在 Activity中有这个全局变量

protected ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder binder) {
        serviceobject = ((NetworkService.MyBinder) binder).getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        serviceobject = null;
    }
};

然后我在活动中绑定服务onCreate(..)使用

bindService(new Intent(this, NetworkService.class), 
                 mConnection,Context.BIND_AUTO_CREATE);

NetworkService 类有一个内部类 MyBinder

public class MyBinder extends Binder {
    NetworkService getService() {
        return NetworkService.this;
    }
}

现在要从活动中调用任何服务方法,我使用serviceobject并为每个方法调用创建一个AsyncTask。(我知道从活动中调用服务方法会使使用服务无效。我将其用于不涉及的轻型方法计算量大)

这有助于我直接处理来自Service使用serviceobject. 我在Activity's中取消绑定服务onDestroy()

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

这是最好的方法还是我在某个地方错了?

4

1 回答 1

1

我想你想做的是运行一个Remote Service. 这就是ServiceConnection习惯bindService。这个想法是您的服务在后台运行,任何活动都可以“绑定”到它并通过您在 AIDL 中定义的接口进行交互。

对服务的访问速度很快,因此您可以从 UI 线程调用服务中的方法,而无需使用AsyncTask. 这是一个好处。

但是实现有点乏味,因为您必须编写此 AIDL 接口。

我建议你在这里阅读谷歌的教程:http: //developer.android.com/guide/developing/tools/aidl.html

然后用“教程”或“示例”搜索“远程服务 AIDL”。

祝你好运。

于 2012-05-20T18:55:56.923 回答