AIDL使用案例

AIDL简介

AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。

AIDL如何使用呢?

一、创建一个studio,这是个服务端项目,然后创建AIDL文件夹

这里写图片描述

二、只会会弹出下图界面,点击finish即可

这里写图片描述

三、这个时候文件目录中就会有一个AIDL文件夹,如下图:

这里写图片描述

四、在这个文件夹中,我们创建一个AIDL接口类,如下图:

这里写图片描述

五、会弹出一个下面图片的界面,让你输入aidl的命名:

这里写图片描述

六、创建成功后效果如下:

这里写图片描述

七、在这个接口我随便先定义一个接口,把默认的先删除:

这里写图片描述

   String getvalue(String s);

上面的七步,就创建好了AIDL相关接口类,下面我们来写代码

一,先创建一个AIDLServer类,并继承Server。

这里写图片描述

二,上图中所有的代码都实现了,就可以引用到我们aidl中的接口了。

这里写图片描述

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;

/**
 * Created by ENZ on 2016/10/21.
 */

public class AIDLServier extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    //创建一个
    IBinder iBinder = new MyAidl.Stub(){


        @Override
        public String getvalue(String s) throws RemoteException {

            return "随便返回一个值";
        }
    };
}

三,最重要的一步,配置清单文件。

这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.com.yanshi">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".AIDLServier"
            android:exported="true"
            android:process=":remote"
            >
            <intent-filter><action android:name="com.example.com.yanshi.AIDLServier"></action>
            </intent-filter>

        </service>
![这里写图片描述](https://img-blog.csdn.net/20161021130200704)
    </application>

</manifest>

致此,服务器就写完了。下面是客户端

一、创建一个客户端,也需要创建一个AIDL,但是包名和接口全部都要一样

这里写图片描述

二、上面点击之后会出现这个界面,一直点击创建即可

这里写图片描述

三、创建成功后

这里写图片描述

四、客户端同样需要创建AIDL,但是接口必须和服务端一样,包名也一样

这里写图片描述

五、然后把服务端的AIDL复制到客户端,外面的包名一样

这里写图片描述

六、编译一下项目,这样aidl才会生效

这里写图片描述

七、代码中如何去绑定服务,并和客户端进行关联呢?

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.com.yanshi.MyAidl;


public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private TextView text_view;
    private Button but;
    private MyAidl myaidl;
    private ServiceConnection conn = new ServiceConnection() {
        @Override
        //如果绑定成功回调此方法
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("Text","qqqqqqqqqqqqqqqqqqqqqqqqqqqqq");
            myaidl = MyAidl.Stub.asInterface(service);
        }

        @Override
        //接触绑定,回调此方法
        public void onServiceDisconnected(ComponentName name) {
            Log.i("Text","ffffffffffffffffffffffffffff");
            myaidl=null;

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        //绑定服务
        binderServer();
    }

    private void binderServer() {
        Intent intent = new Intent();
        //请仔细看服务端清单文件中的配置信息
        intent.setComponent(new ComponentName("com.example.com.yanshi","com.example.com.yanshi.AIDLServier"));
        bindService(intent,conn, Context.BIND_AUTO_CREATE);
        Log.i("Text","*********************************");
    }

    private void init() {
        text_view = (TextView)findViewById(R.id.text_view);
        but=(Button)findViewById(R.id.but);
        but.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.but:
                try {
                    //点击后,通过我们创建的AIDL对象进行调用接口传递参数给服务端。服务端进行处理
                    String s=myaidl.getvalue("ddd");
                    text_view.setText(s);
                    Toast.makeText(MainActivity.this,"tttttttttttttttttt"+s,Toast.LENGTH_SHORT);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}![这里写图片描述](http://img.blog.csdn.net/20161021131544534)

八、用真机运行这两个项目,保证两者都在运行状态

这里写图片描述

九、结果,我们获得到了服务器给我们返回的值,至此,这个例子就OK了。

这里写图片描述

demo:http://download.csdn.net/detail/bobo8945510/9660006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值