您的位置:首页 > 移动开发 > Android开发

service(二) Android Studio 编写远程服务

2015-10-20 16:20 441 查看
本文参考于 http://android.blog.51cto.com/268543/537684/

相信eclipse中大家  对远程服务都有一定的了解 。这里我在网上找了点资料,并尝试了下 在Android studio中编写远程服务。

 网上有两种做法,这里我只用了一种:

   首先切换到project目录下,在main文件夹下创建文件 aidl,然后在aidl创建包名(Manifest中的包名),再在这个包里创建我们的服务IMyService.aidl。编译一下,在build/generated/source/aidl/debug/包名,在包名下面就可以发现studio为我们生成的文件。

下面是我的服务文件:

package com.example.xiao8.myapplication;

interface IMyService{
void savePersonInfo(int personId);

}

 AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。

    其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。

    而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import.

    需要特别注意的是,对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。

    AIDL只支持接口方法,不能公开static变量。

(这里摘一下大神写的东西,希望大神能够原谅我)

我这里只写了个简单的int类型,如果需要复杂的类型的话参考http://android.blog.51cto.com/268543/537684/

下面我们写下远程服务的具体类:

public class RemoteService extends Service {
public IBinder onBind(Intent intent) {
Log.d("ljy","----server----接收到的数据----->"+intent.getStringExtra("msg"));
return mBinder;
}

private final IMyService.Stub mBinder = new IMyService.Stub() {
@Override
public void savePersonInfo(int personId) throws RemoteException {
Log.d("ljy", "-----personId------->" + personId);
}
};
}
这里我们 new一个studio帮我们生成的对象IMyService.Stub,并在onBind中返回。和本地服务相似,只是Bind换成了Stub。

下面写客户端:

同样执行下 服务器端aidl文件的创建:

首先切换到project目录下,在main文件夹下创建文件 aidl,然后在aidl创建包名(Manifest中的包名),再在这个包里创建我们的服务IMyService.aidl。编译一下,在build/generated/source/aidl/debug/包名,在包名下面就可以发现studio为我们生成的文件。

然后写下客户端的代码,这里和本地服务是相似的,只是获取服务的方法换成了IMyService.Stub.asInterface

public class MainActivity extends AppCompatActivity {

private IMyService mRemoteService;
private ServiceConnection mRemoteConnection;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRemoteConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mRemoteService = IMyService.Stub.asInterface(service); //获取远程服务
}

@Override
public void onServiceDisconnected(ComponentName name) {

}
};
}

public void doClick(View v){
Intent intent = new Intent("remoteService");
intent.putExtra("msg", "data");

switch (v.getId()){
case R.id.bind:
bindService(intent,mRemoteConnection, BIND_AUTO_CREATE);
break;
case R.id.unbind:
unbindService(mRemoteConnection);
break;
case R.id.set_data:
if(null!=mRemoteService){
try {
mRemoteService.savePersonInfo(10);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: