AIDL学习与实践

什么是AIDL

1.AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。
2.设计这门语言的目的是为了实现 进程间通信 。
3.默认支持的数据类型包括:
- Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。
- String 类型。
- CharSequence类型。
- List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型。
- Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的。

参考:Android:学习AIDL,这一篇文章就够了(上)


什么时候用AIDL

通信方式条件是否跨应用是否多线程
AIDLIPC多个应用多线程
binderIPC单个应用无多线程
MessagerIPC无多线程

创建AIDL

在Android studio中创建AIDL文件是需要Gradle一下的,在Eclipse中是不需要进行构建。

代码

AIDL接口
interface IMyAidlInterface {
       int add(int num1,int num2);
}
server
public class RmoteService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }
    private IBinder iBinder = new IMyAidlInterface.Stub(){
        @Override
        public int add(int num1, int num2) throws RemoteException {
            return num1+num2;
        }
    };
}
client
public class MainActivity extends AppCompatActivity {

    private EditText editText1;
    private EditText editText2;
    private EditText editText3;
    IMyAidlInterface i;
    private Button button;
    int num2;
    int num1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText1 = (EditText)findViewById(R.id.editText);
        editText2 = (EditText)findViewById(R.id.editText2);
        editText3 = (EditText)findViewById(R.id.editText3);

        button = (Button)findViewById(R.id.button);
      num1 = Integer.parseInt(editText1.toString());
       num2 = Integer.parseInt(editText2.toString());
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                  int re =   i.add(num1,num2);
                    editText3.setText(re+"");
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

            }

            private void bindServices() {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName("wu.com.aidl_test","wu.com.aidl_test.RmoteService"));

                bindService(intent,conn, Context.BIND_AUTO_CREATE);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(conn);
    }

    ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                //拿到了远程的服务
                i = IMyAidlInterface.Stub.asInterface(service);
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {
                i= null;
            }
        };


}

实现的功能:
在客户端中输入两个数字,绑定服务器,在服务器端进行计算后返回给客户端并显示在界面上。

在Activity销毁时记得解绑Service。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值