AIDL简单应用
2020-07-21 04:14
946 查看
这是一个简单的AIDL应用的例子,先讲一下步骤:
1. 新建项目AIDLFakeAlipay
- 在 main目录下创建一个aidl文件夹,右键app->New->Folder->AIDL Folder
-
在aidl文件夹下面创建一个包,在包里面创建一个aidl文件:
image - 在aidl文件中写一个要被调用的方法,这里面不能加任何权限修饰符,除此之外语法和java相同
// Alipay.aidl package com.example.houchongmu.aidlfakealipay; // Declare any non-default types here with import statements interface Alipay { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ String pay(String company,float money,String count,String pwd); }
- 之后可以Build->Make Project,看app/build/source/generated/aidl/debug/步骤二创建的包名/ 下面有没有创建一个Alipay.java文件
- 创建AlipayService,这个服务是用于其他应用通过bindService来绑定的,这里面将上面生成的Alipay.java对象返回出去,虽然返回的是一个Binder对象,但可以认为Alipay.java对象存储在里面,我们后面要在另一个应用中获取到Alipay的对象并调用它的方法。
package com.example.houchongmu.aidlfakealipay; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; public class AlipayService extends Service { public AlipayService() { } @Override public IBinder onBind(Intent intent) { return new AlipayBinder(); } public String pay(String company,float money, String count, String pwd){ Log.d("tag", "处理了一笔转账业务:company="+company+"/money="+money+"/count="+count+"/pwd="+pwd); return count+"给"+company+"支付了"+money; } class AlipayBinder extends Alipay.Stub{ @Override public String pay(String company, float money, String count, String pwd) throws RemoteException { return AlipayService.this.pay(company,money,count,pwd); } } }
这里的Alipay.Stub官方的解释就是
public static abstract class Alipay.Stub extends android.os.Binder implements Alipay Local-side IPC implementation stub class.
- 给这个服务添加一个action
<service android:name=".AlipayService" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="com.alipay.payserver"/> </intent-filter> </service>
2.建一个AIDLFakeMeituan项目
- 创建一下UI(四个EditText一个Button)
略 - 这里同样需要创建一个AIDL的文件夹,跟上面的步骤是一样的,这里注意aidl的包名必须要跟Alipay的包名一模一样,否则就会出错,aidl文件直接从AIDLFakeAlipay中拷过来就行了,然后Make Project,同样看是否生成了Alipay.java
- 看MainActivity
package com.example.houchongmu.aidlfakemeituan; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.example.houchongmu.aidlfakealipay.Alipay; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class MainActivity extends AppCompatActivity { private EditText et_company; private EditText et_money; private EditText et_count; private EditText et_pwd; private Alipay alipay; private AlipayServiceConnection alipayServiceConnection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_company = findViewById(R.id.et_company); et_money = findViewById(R.id.et_money); et_count = findViewById(R.id.et_count); et_pwd = findViewById(R.id.et_pwd); alipayServiceConnection = new AlipayServiceConnection(); Intent intent=new Intent("com.alipay.payserver"); intent.setPackage("com.example.houchongmu.aidlfakealipay"); bindService(intent,alipayServiceConnection,BIND_AUTO_CREATE); } class AlipayServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { alipay=Alipay.Stub.asInterface(service);//得到Alipay对象 Toast.makeText(MainActivity.this, "服务已经绑定", Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(MainActivity.this, "实在抱歉远程服务已经意外终止了。", Toast.LENGTH_SHORT).show(); } } public void pay(View view) { String company = et_company.getText().toString().trim(); String count = et_count.getText().toString().trim(); String money = et_money.getText().toString().trim(); String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(company)||TextUtils.isEmpty(count)||TextUtils.isEmpty(pwd)||TextUtils.isEmpty(money)) { Toast.makeText(this, "输入的内容都不能为空!", Toast.LENGTH_SHORT).show(); return; } if (alipay==null) { Toast.makeText(this, "服务绑定失败,请重新启动该界面", Toast.LENGTH_SHORT).show(); return; } Float moneyFloat = Float.valueOf(money); try { String result= alipay.pay(company,moneyFloat,count,pwd); Toast.makeText(this, "转账成功:"+result, Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); Toast.makeText(this, "转账失败:" ,Toast.LENGTH_SHORT).show(); } } }
- 首先创建一个AlipayServiceConnection,在onServiceConnected方法里面先从AlipayService返回的IBinder对象service中获取到Alipay对象。
- 在onCreate方法里面我们直接去绑定服务,这里的intent需要设置AIDLFakeAlipay中AlipayService设置的action,还需要设置一个组件的包名,就是AlipayService的包名,这样更准确地启动这个Service,但是试了不加这个包名绑定不成功。这样Activity一启动就能与AlipayService服务绑定,并将Alipay赋值。
- 在button的onClick里面,获取到UI输入的值后调用alipay.pay方法,这里可以理解为这个alipay实例就是AIDLFakeAlipay里面Alipay的实例,所以就实现了两个应用跨进程通信。
-
看运行结果:
image -
AIDLFakeAlipay打印的日志:
image
相关文章推荐
- Android AIDL的简单应用
- AIDL简单使用(通过它跨应用传递对象(数据))
- Net time命令的简单应用
- 网络学习(二十一)创建用户及文件夹共享设置的简单应用
- 数据结构 二叉树常用简单应用
- javascript dom代码应用 简单的相册[firefox only]
- CoreText 使用教程:以创建一个简单的杂志应用为例
- 文件的简单操作(续):IO流的应用
- xmu 1073: 选课(拓扑排序的简单应用)
- C++ 的简单应用
- 安卓中 广播 服务 及其简单应用范围的一些总结
- 函数指针的简单应用
- jQuery 计时器(jquery timers)简单应用
- Managed DirectX中的DirectShow应用(简单Demo及源码)
- 简单介绍如何应用DDMS协助开发Android Apps
- ASP.NET MVC4(2)ASP.NET MVC4 Web应用之实现简单的增删改查
- awt简单应用五 -单选框
- ARM架构kprobe应用及实现分析(1.0 简单示例)
- Django-Sphinx 安装和简单应用
- tshark简单应用指令