美文网首页
AIDL简单应用

AIDL简单应用

作者: Yolyn | 来源:发表于2018-09-02 12:04 被阅读78次

    这是一个简单的AIDL应用的例子,先讲一下步骤:

    1. 新建项目AIDLFakeAlipay

    1. 在 main目录下创建一个aidl文件夹,右键app->New->Folder->AIDL Folder
    2. 在aidl文件夹下面创建一个包,在包里面创建一个aidl文件:


      image
    3. 在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);
    }
    
    
    1. 之后可以Build->Make Project,看app/build/source/generated/aidl/debug/步骤二创建的包名/ 下面有没有创建一个Alipay.java文件
    2. 创建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.
    
    1. 给这个服务添加一个action
     <service
                android:name=".AlipayService"
                android:enabled="true"
                android:exported="true"
                >
                <intent-filter>
                    <action android:name="com.alipay.payserver"/>
                </intent-filter>
            </service>
    

    2.建一个AIDLFakeMeituan项目

    1. 创建一下UI(四个EditText一个Button)
    2. 这里同样需要创建一个AIDL的文件夹,跟上面的步骤是一样的,这里注意aidl的包名必须要跟Alipay的包名一模一样,否则就会出错,aidl文件直接从AIDLFakeAlipay中拷过来就行了,然后Make Project,同样看是否生成了Alipay.java
    3. 看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();
    
            }
        }
    }
    
    
    1. 首先创建一个AlipayServiceConnection,在onServiceConnected方法里面先从AlipayService返回的IBinder对象service中获取到Alipay对象。
    2. 在onCreate方法里面我们直接去绑定服务,这里的intent需要设置AIDLFakeAlipay中AlipayService设置的action,还需要设置一个组件的包名,就是AlipayService的包名,这样更准确地启动这个Service,但是试了不加这个包名绑定不成功。这样Activity一启动就能与AlipayService服务绑定,并将Alipay赋值。
    3. 在button的onClick里面,获取到UI输入的值后调用alipay.pay方法,这里可以理解为这个alipay实例就是AIDLFakeAlipay里面Alipay的实例,所以就实现了两个应用跨进程通信。
    4. 看运行结果:


      image
    5. AIDLFakeAlipay打印的日志:


      image

    相关文章

      网友评论

          本文标题:AIDL简单应用

          本文链接:https://www.haomeiwen.com/subject/gifmwftx.html