本节学习Service的分类: 本地服务, 远程服务
本地服务: 指的是服务和启动服务的activity在同一个进程中
远程服务:指的是服务和启动服务的activity不在同一个进程中
我们以前使用的都是本地服务,今天我们学习远程服务。学习远程服务就必须要学习AIDL(Android Interface Definition Language)安卓接口定义语言。编译器通过AIDL文件的描述信息生成符合通信协议的JAVA代码。我们在进程间通信的时候只需要调用即可。
既然要实现远程服务,就需要一个服务端,一个客户端。
我们实现如下一例子。 游戏支付,一般游戏支付的话都会选择第三方的平台,比如支付宝。 而支付宝的支付接口不是会放到游戏进程中运行,那么支付宝支付服务就是个远程服务。而第三方游戏就是客户端
那我们先创建一个服务端:
public class ZhiFuBaoService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
/*中间人的支付方法*/
class Pay extends Binder implements ZhiFuInterface
{
public void PayMoney()
{
ZhiFuBaoPay();
}
}
/*支付宝的支付接口*/
public void ZhiFuBaoPay()
{
Log.i("ZhiFuBaoService", "支付成功!");
}
}
如果是本地服务,我们的Service就是如上的形式,但是如果是远程服务,就必须使用AIDL接口定义语言,对上面的代码改造。
第一步: 把远程服务的方法抽取成一个单独的接口java文件,也就是我们的PayMoney方法,这个已经为接口了
第二步: 把接口java文件的后缀名改成aidl
注意: aidl文件中的方法全是public方法,如果有public就必须去掉,不然会报错
第三步: 在自动生成的ZhiFuInterface.java文件中,有一个静态类Stub,它已经继承了binder类,实现了ZhiFuInterface接口了。
所以我们的中间人就改为:
/*中间人的支付方法*/
class Pay extends Stub
{
public void PayMoney()
{
ZhiFuBaoPay();
}
}
因为第四步是和客户端相关的,我们先创建一个某游戏客户端,客户端Activity中有一个支付按钮,用于支付
第四步: 把aidl文件复制粘贴到客户端项目,粘贴的时候注意,aidl文件所在的包名必须跟服务端项目中aidl所在的包名一致
第五步: 在客户端项目中,强转中间人对象时,直接使用Stub.asInterface()
public class MainActivity extends Activity {
private MyServiceConn conn;
private Intent intent;
ZhiFuInterface zhifu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent();
conn = new MyServiceConn();
//设置服务的action
intent.setAction("com.demo.paymoney");
//绑定远程服务
bindService(intent, conn, BIND_AUTO_CREATE);
}
//支付游戏道具
public void pay(View v)
{
try {
zhifu.PayMoney();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class MyServiceConn implements ServiceConnection
{
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
zhifu = Stub.asInterface(arg1);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
}
}
记得服务端的Service需要到配置文件中注册:
<service android:name="com.demo.aidlservice.ZhiFuBaoService">
<intent-filter >
<action android:name="com.demo.paymoney"/>
</intent-filter>
</service>
一下是运行情况,当你点击支付时,会有如下打印:
ok。 关于远程服务就说到这里