我尝试为客户端和服务器之间的通信创建远程服务。 主要想法是用我的主要活动开始服务 当服务启动时,它将获取服务器地址和端口以打开套接字。
我希望它是远程服务,因此其他应用程序将能够使用相同的服务。 该服务将通过向服务器发送和接收数据来保持连接的活跃性。 它将具有读取\ 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。
答案 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()
。