最佳实践 - 将活动绑定到活动

cod*_*lus 5 android android-service android-activity

我有一个在后台运行的网络服务.我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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

bindService(new Intent(this, NetworkService.class), 
                 mConnection,Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)

NetworkService类有一个内部类MyBinder

public class MyBinder extends Binder {
    NetworkService getService() {
        return NetworkService.this;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在从Activity调用任何Service方法,我使用serviceobject和我AsyncTask为每个方法调用创建一个.(我知道从Activity调用Service方法无效使用Services.I将它用于不涉及的轻量级方法很多计算)

这有助于我直接处理来自Service使用的数据serviceobject.我取消绑定服务中ActivityonDestroy()

@Override
protected void onDestroy()
{
    unbindService(mConnection);
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

这是最好的方式,还是我错了?

zna*_*nat 1

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

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

然而,实现起来有点乏味,因为你必须编写这个 AIDL 接口。

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

然后用“教程”或“示例”谷歌“远程服务AIDL”。

祝你好运。