本地应用调用远程服务中的方法
* AIDL:安卓接口定义语言 ,来公开服务的接口的方式来暴露服务接口
* IPC:进程间通讯
intel-process communication
* AIDL编写步骤:
远程工程
1. 把IRemoteService.java接口改成.aidl的接口
2. 去掉.aidl接口文件的权限修饰符public
3. 让远程服务里的内部类继承Stub
package com.example.alipay; import android.app.Service; import android.content.Intent; import android.os.IBinder; import com.example.alipay.IAliPayService.Stub; public class AliPayService extends Service{ @Override public IBinder onBind(Intent intent) { return new XiaoMa(); } private class XiaoMa extends Stub{ @Override public int pay(String name, String pwd, float money, long time) { System.out.println("用户名:"+name); System.out.println("密码:"+pwd); if (!"翠花".equals(name) || !"123".equals(pwd)) { return 300; } System.out.println("查询账户余额是否充足"); if (1000 <= money) { return 400; } System.out.println("我是支付宝里的方法:"+money); return 200; } } }
把IRemoteService.java接口改成.aidl的接口 去掉.aidl接口文件的权限修饰符public package com.example.alipay; interface IAliPayService { /** * 支付宝支付的方法 * * @param name * 用户名 * @param pwd * 密码 * @param money * 支付金额 * @param time * 时间戳 * 返回值: 500:支付宝的错误 400:用余额不足 300:密码或者账号错误 200:支付成功 100:时间又问题 */ int pay(String name, String pwd, float money, long time); }
本地工程 4. 创建和远程工程里远程服务组件所在的包名一样的包 5. 把远程工程里的.aidl文件复制到这个包里 6. 在连接成功后,Stub.asInterface(service) 7. 用强转后的对象间接调用远程服务里的方法
package com.example.game; import com.example.alipay.IAliPayService; import com.example.alipay.IAliPayService.Stub; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定远程服务 Intent intent = new Intent(); intent.setAction("com.example.alipay.AliPayService.PAY"); bindService(intent, new PayConn(), BIND_AUTO_CREATE); } public void dian(View v){ try { int code = mService.pay("翠花", "123",1, System.currentTimeMillis()); if (code == 200) { Toast.makeText(this, "亲爱的,支付成功", 0).show(); }else if(code == 300){ Toast.makeText(this, "亲,请输入正确的账号或者密码", 0).show(); }else if (code == 400) { Toast.makeText(this, "亲,金额不足", 0).show(); }else if (code == 100) { Toast.makeText(this, "请5分钟后重新支付", 0).show(); } } catch (RemoteException e) { e.printStackTrace(); } } private IAliPayService mService; /** * activity和service的连接通道 */ private class PayConn implements ServiceConnection { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = Stub.asInterface(service); } } }
package com.example.alipay; interface IAliPayService { /** * 支付宝支付的方法 * * @param name * 用户名 * @param pwd * 密码 * @param money * 支付金额 * @param time * 时间戳 * 返回值: 500:支付宝的错误 400:用余额不足 300:密码或者账号错误 200:支付成功 100:时间又问题 */ int pay(String name, String pwd, float money, long time); }
最后,关注【码上加油站】微信公众号后,有疑惑有问题想加油的小伙伴可以码上加入社群,让我们一起码上加油吧!!!