美文网首页
AIDL:Android接口定义语言浅解

AIDL:Android接口定义语言浅解

作者: LiKaiRabbit | 来源:发表于2017-09-22 14:44 被阅读36次

    Android Interface Definition Language即AIDL,这个名字好高端:接口定义语言。什么意思?

    就是跨进程数据通信的方式,为啥不能直接通信还要搞个这个?

    因为所以自然道理,呵呵。

    因为他们本来不能通信,为啥不能通信呢?

    因为在不同的进程,为什么在不同的进程不能通信呢?

    因为每个进程有自己的内存区域存储数据,一个进程不能访问另外一个进程的内存空间,为啥不能访问呢?

    因为所以自然道理,去他的自然道理,google不让你访问就是不让你访问,哪来的这么多问号啊?????????????

    不过人家谷歌还是讲道理的,不让你访问是因为安全考虑,你能随便进别人家吗,然当不能了,除非人家给你钥匙啊----AIDL

    但是话又说回来了,我在自己家(一个app一个进程)干嘛要去别人家?

    你不听音乐啊(音乐后台播放),你不微信啊(微信消息推送),你不打电话啊(开启拨打号码,打电话实际上也是一个app应用,当然了这是系统的的跨进程通信,使用的是intent),当然了可以干的事情很多了,你也可以有两个家啊(启动远程service)。

    当然了进程间通信(IPC),也可以用Message来实现,message内部也是用AIDL实现的。

    如果确实需要IPC,但是无需处理多线程,那么就应该通过Messenger来实现。Messenger保证了消息是串行处理的

    在有IPC需求,同时服务端需要并发处理多个请求的时候,使用AIDL才是必要的

    我们来自己做把钥匙AILD简单实现

    1.新建一个aidl文件

    2.文件目录会增加AIDL文件夹和你刚增加的文件

    3.这是一个接口,所以你要在里面增加你需要的方法

        interface IMyAidlInterface {
    
            void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
            //增加一个两个参数的方法
            int change(int a,int b);
    }
    

    4.rebuild一下,系统会帮你新建一个IMyAidlInterface的java文件,然后不用管了,改天再细说这个文件

    5.写一个service,里面返回的IBinder对象就是IMyAidlInterface.Stub,实现刚才我们的change(int a, int b)方法。

      public class MyService extends Service {
    
    private final IMyAidlInterface.Stub mStub  = new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double     
             aDouble, String aString) throws RemoteException {
    
        }
    
        @Override
        public int change(int a, int b) throws RemoteException {
            //打印一下service的进程id
            System.out.println("service所在的进程是: " + android.os.Process.myPid());
           //返回a,b的和
            return a+b;
        }
    };
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mStub;
    }
     }
    

    6.注册我们的service,让其运行在不同进程:

      <service 
                 android:name=".MyService"
                 android:process=":remote"
                 android:enabled="true"
                 android:exported="true"/>
    

    7.activity里面绑定service,然后启动,我们就可以和service通信了

    public class MainActivity extends AppCompatActivity {
    
    private IMyAidlInterface serice;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setClass(this,MyService.class);
        bindService(intent,conn,BIND_AUTO_CREATE);
    
    }
    
    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
             serice = IMyAidlInterface.Stub.asInterface(service);
            try {
                int change = serice.change(22, 33);
                System.out.println("MainActivity所在的进程是:" +android.os.Process.myPid());
                System.out.println("22+33的值是;"+change);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
            serice=null;
        }
    };
    }
    

    8.看看打印的线程和返回的数值:

    相关文章

      网友评论

          本文标题:AIDL:Android接口定义语言浅解

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