本节学习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 android:name="com.demo.aidlservice.ZhiFuBaoService"> <intent-filter > <action android:name="com.demo.paymoney"/> </intent-filter> </service>
ok。 关于远程服务就说到这里
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/longwang155069/article/details/47086023