AIDL简单例子

作者: 奔跑吧李博 | 来源:发表于2019-03-23 11:27 被阅读8次
    AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。
    实现AIDL调用示例:
    1.AIDL公用接口端:

    在main下建立aidl包,在项目路径下建立aidl接口,以aidl结尾

    package com.example.apple.aidluse;
    import com.example.apple.aidluse.UserBean;
    
    interface IGetUser {
        UserBean getUserBean();
    }
    
    2.创建UserBean实体类,需要实现Parcelable。
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class UserBean implements Parcelable{
        private String name;
        private int age;
    
        public UserBean(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
    
        protected UserBean(Parcel in) {
            name = in.readString();
            age = in.readInt();
        }
    
        public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {
            @Override
            public UserBean createFromParcel(Parcel in) {
                return new UserBean(in);
            }
    
            @Override
            public UserBean[] newArray(int size) {
                return new UserBean[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(age);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
    3.创建UserBean.aidl
    package com.example.apple.aidluse;
    parcelable UserBean;
    
    4.创建Service类
    public class UserService extends Service{
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    
        //使用IGetUser之前,需要编译或运行一下,不然找不到接口
        private Binder binder = new IGetUser.Stub(){
    
            @Override
            public UserBean getUserBean(){
                return new UserBean("小王",23);
            }
        };
    }
    
    5.注册UserService
            <service android:name=".UserService"
                android:exported="true"
                android:enabled="true" >
                <intent-filter>
                    <action android:name="com.example.apple.aidluse.UserService" />
                </intent-filter>
            </service>
    
    客户端
    1.创建ServiceConnection对象,绑定服务连接上Service后,使用IBinder对象,IGetUser.Stub.asInterface(service)获取接口,调用接口方法远程调用服务端的方法进行处理,获取想要的结果。
        private ServiceConnection serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                IGetUser iGetUser = IGetUser.Stub.asInterface(service);
                try {
                    UserBean userBean = iGetUser.getUserBean();
                    Toast.makeText(getApplication(),userBean.getName() + "------" + userBean.getAge(),Toast.LENGTH_SHORT).show();
    
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    
    2.启动服务端:
        public void startService(View view) {
            Intent intent = new Intent(this, UserService.class);
            startService(intent);
        }
    
    3.客户端绑定服务端:
        public void bindService(View view) {
            Intent intent1 = new Intent();
            intent1.setAction("com.example.apple.aidluse.UserService");
            Intent explicitIntent = createExplicitFromImplicitIntent(this,intent1);
            bindService(explicitIntent, serviceConnection, Context.BIND_AUTO_CREATE);
        }
    
        public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
            // Retrieve all services that can match the given intent
            PackageManager pm = context.getPackageManager();
            List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
    
            // Make sure only one match was found
            if (resolveInfo == null || resolveInfo.size() != 1) {
                return null;
            }
    
            // Get component info and create ComponentName
            ResolveInfo serviceInfo = resolveInfo.get(0);
            String packageName = serviceInfo.serviceInfo.packageName;
            String className = serviceInfo.serviceInfo.name;
            ComponentName component = new ComponentName(packageName, className);
    
            // Create a new intent. Use the old one for extras and such reuse
            Intent explicitIntent = new Intent(implicitIntent);
    
            // Set the component to be explicit
            explicitIntent.setComponent(component);
    
            return explicitIntent;
        }
    

    这里是github代码直通车

    相关文章

      网友评论

        本文标题:AIDL简单例子

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