Android 采用AIDL绑定远程服务

来源:互联网 发布:博途v14软件下载 编辑:程序博客网 时间:2024/05/16 06:25

如果服务Service和Activity在同一个应用里,我们可以按照上一篇文章记录里的那样去控制,但是如果不在一个应用中,那该如何控制呢?例如阿里客户端,不仅仅是在淘宝网上可以支付,在其他地方支付页面(游戏购买道具页面等),第三方工具都可以打开使用。

1、新建第一个工程:支付宝安全支付

XML布局文件和Activity中没有任何操作,新建一个接口Iservice.java

package com.example.study;public interface Iservice {public void callMethodInService();}
找到源文件的存储位置,将Iservice.java文件的后缀名改成.aidl,再返回编辑页面,刷新就可以看到文件会报错,为什么呢?因为AIDL本身就是为了别的程序调用的,所以不需要加上public或者private等修饰,去掉之后如下:

package com.example.study;interface Iservice {void callMethodInService();}
刷新之后可以看到,在gen目录的包下,已经生产了Iservice.java的文件,这个是系统自动生成的,不用管。

2、新建一个Service文件,如下:

public class PayService extends Service{@Overridepublic IBinder onBind(Intent intent) {// TODO 自动生成的方法存根System.out.println("远程支付服务:+onBind");return new myBinder();}@Overridepublic boolean onUnbind(Intent intent) {// TODO 自动生成的方法存根System.out.println("远程支付服务:+onUnbind");return super.onUnbind(intent);}@Overridepublic void onCreate() {// TODO 自动生成的方法存根System.out.println("远程支付服务:+onCreate");super.onCreate();}@Overridepublic void onDestroy() {// TODO 自动生成的方法存根System.out.println("远程支付服务:+onDestory");super.onDestroy();}private void methodInservice(){System.out.print("我是远程支付宝的服务,用来支付 ");}//private class myBinder extends Binder implements Iservice{////@Override//public void callMethodInService() {//// TODO 自动生成的方法存根//methodInservice();//}//这个时候就不需要继承Binder实现Servicel //}<strong><span style="font-size:12px;color:#ff0000;">private class myBinder extends Iservice.Stub{ //stub已经继承了Binder实现了Iservice@Overridepublic void callMethodInService(){// TODO 自动生成的方法存根methodInservice();}}</span></strong>}
服务文件基本创建完成,下边创建调用文件

3、新建一工程:游戏支付
      布局文件中添加两个按钮,bind和call,前者用来绑定服务,后者用来调用服务里的方法。

首先:建立一个包,包名和Iservice.aidl的完全一样,把Iservice.aidl文件拷贝进去,刷新后再gen目录下也会同样出现Iservice.java文件。

public class MainActivity extends Activity {private Intent intent ;private Iservice iservice;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intent = new Intent();intent.setAction("com.study.pay");}public void bind(View view){bindService(intent, new myConn(), BIND_AUTO_CREATE);}public void call(View view){try {iservice.callMethodInService();} catch (RemoteException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}//创建一个Serviceconn类<span style="font-size:14px;"><strong><span style="color:#ff0000;">private class myConn implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name,IBinder service) {//由于此方法是自动执行的,所以返回一个service,自定义一个service等于返回的这个service</span>iservice = Iservice.Stub.asInterface(service);<span style="color:#ff0000;">}@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO 自动生成的方法存根}}</span></strong></span>}
这样就OK了,可以看到点击按钮之后,Service中会打印出相对应的log。

0 0