android在远程服务和活动之间进行通信

时间:2012-11-05 14:19:40

标签: android service aidl

我尝试为客户端和服务器之间的通信创建远程服务。 主要想法是用我的主要活动开始服务 当服务启动时,它将获取服务器地址和端口以打开套接字。

我希望它是远程服务,因此其他应用程序将能够使用相同的服务。 该服务将通过向服务器发送和接收数据来保持连接的活跃性。 它将具有读取\ write Int和String的方法。 换句话说,实现套接字输入和输出方法......

我现在面临的问题是了解远程服务在android中是如何工作的。 我开始创建一个小服务,只有一个返回int的方法。 这是一些代码:

ConnectionInterface.aidl:

    interface ConnectionInterface{
      int returnInt();
    }

ConnectionRemoteService.java:

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;

public class ConnectionRemoteService extends Service {
    int testInt;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();
}



@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
}

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

private ConnectionInterface.Stub myRemoteServiceStub = new ConnectionInterface.Stub() {
    public int returnInt() throws RemoteException {
        return 0;
    }
};

}

和我主要活动中“onCreate”的一部分:

final ServiceConnection conn = new ServiceConnection() {
        public void onServiceConnected(ComponentName name, IBinder service) {
            ConnectionInterface myRemoteService = ConnectionInterface.Stub.asInterface(service);
        }
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    final Intent intent = new Intent(this, ConnectionRemoteService.class);

稍后我有一个2个OnClickListeners来绑定和取消绑定服务:

bindService(intent, conn, Context.BIND_AUTO_CREATE);
unbindService(conn);

我在这里缺少的一部分是如何使用服务中的方法? 现在我只有一个返回int值的方法。 我怎么称呼它? 以及如何使用其他方法获取服务的值?

感谢, Lioz。

1 个答案:

答案 0 :(得分:0)

成功绑定到服务后,将使用您随后用于与服务通信的服务绑定器调用onServiceConnected()。目前,您只是将其放在局部变量myRemoteService中。您需要做的是将其存储在主活动的成员变量中。因此,在主要活动中将其定义为:

private ConnectionInterface myRemoteService;

然后,在onServiceConnected()中执行:

myRemoteService = ConnectionInterface.Stub.asInterface(service);

稍后,当您想要使用服务的方法时,请执行以下操作:

// Access service if we have a connection
if (myRemoteService != null) {
    try {
        // call service to get my integer and log it
        int foo = myRemoteService.returnInt();
        Log.i("MyApp", "Service returned " + foo);
    } catch (RemoteException e) {
        // Do something here with the RemoteException if you want to
    }
}

确保在没有与服务连接时将myRemoteService设置为null。您可以在onServiceDisconnected()

中执行此操作