4-AIII--Service跨进程通信:aidl

作者: e4e52c116681 | 来源:发表于2018-08-25 14:07 被阅读2次

    零、前言

    [1]. aidl:Android Interface definition language(安卓接口定义语言),目的:提供进程间的通信接口
    [2]. 一个应用提供服务:称为服务应用,一个使用服务:称为客户应用
    [3]. 解决客户应用如何调用服务应用的服务方法时,便是aidl用武之地
    [4]. 服务端开启验证服务,客户端输入用户名和命名及数值,验证用户名:abc,密码:123,数值<5000

    aidl.gif aidl.png

    一、服务端代码实现:

    1.com/toly1994/aiii_service/IPayAidlInterface.aidl
    // IPayAidlInterface.aidl
    package com.toly1994.aiii_service;
    
    // Declare any non-default types here with import statements
    
    interface IPayAidlInterface {
        //暴露方法
       boolean pay(String name, String pwd, int money);
    }
    
    
    2.PayService服务
    public class PayService extends Service {
    
        @Override
        public IBinder onBind(Intent arg0) {
            return new MyBinder();
        }
    
        public class MyBinder extends IPayAidlInterface.Stub {
    
            @Override
            public boolean pay(String name, String pwd, int money) {
                return "abc".equals(name) && "123".equals(pwd) && money < 5000;
            }
        }
    }
    
    3.注册:app/src/main/AndroidManifest.xml
    <service android:name=".aidl.PayService"
             android:enabled="true"
             android:process=":push"
             android:exported="true">
        <intent-filter>
            <action android:name="www.toly1994.com.pay"></action>
        </intent-filter>
    </service>
    
    4.AidlActivity:启动服务
    public class AidlActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            startService(new Intent(this, PayService.class));
        }
    }
    

    二、客户端

    1. MainActivity
    public class MainActivity extends AppCompatActivity {
    
        @BindView(R.id.et_acc)
        EditText mEtAcc;
        @BindView(R.id.et_pass)
        EditText mEtPass;
        @BindView(R.id.et_num)
        EditText mEtNum;
        @BindView(R.id.btn_buy)
        Button mBtnBuy;
        private ServiceConnection mConn;
        private IPayAidlInterface mService;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
    
            bindService();
        }
    
        /**
         * 绑定远程服务
         */
        private void bindService() {
            Intent intent = new Intent();
            //坑点:5.0以后要加 服务包名,不然报错
            intent.setPackage("com.toly1994.aiii_service");
            intent.setAction("www.toly1994.com.pay");
            mConn = new ServiceConnection() {
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
    
                    mService = IPayAidlInterface.Stub.asInterface(service);
                }
    
                @Override
                public void onServiceDisconnected(ComponentName name) {
                }
            };
            bindService(intent, mConn, BIND_AUTO_CREATE);
        }
    
    
        @OnClick(R.id.btn_buy)
        public void onViewClicked() {
            try {
                boolean isPay = mService.pay(mEtAcc.getText().toString(),
                        mEtPass.getText().toString(),
                        Integer.parseInt(mEtNum.getText().toString()));
                
                Toast.makeText(this, isPay ? "购买成功" : "购买失败", Toast.LENGTH_SHORT).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onDestroy() {
            unbindService(mConn);
            super.onDestroy();
        }
    }
    
    2.com/toly1994/aiii_service/IPayAidlInterface.aidl
    // IPayAidlInterface.aidl
    package com.toly1994.aiii_service;
    
    // Declare any non-default types here with import statements
    
    interface IPayAidlInterface {
        //暴露方法
       boolean pay(String name, String pwd, int money);
    }
    
    
    附录、客户端布局文件:activity_main.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical" >
    
        <EditText
            android:id="@+id/et_acc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入账号" />
        <EditText
            android:id="@+id/et_pass"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入密码" />
        <EditText
            android:id="@+id/et_num"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="1"
            android:hint="请输入数额" />
        <Button
            android:id="@+id/btn_buy"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="确定" />
    
    </LinearLayout>
    

    注意坑点:5.0以后用action启动服务要加服务所在应用的包名,不然报错

    本文由张风捷特烈原创,转载请注明
    更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94
    张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com
    你的喜欢与支持将是我最大的动力

    相关文章

      网友评论

        本文标题:4-AIII--Service跨进程通信:aidl

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