Android中进程间通讯 AIDL
IDL Interface Description Language  接口描述语言
AIDL Android IDL

适用场景:
   client进程必须是Activity,服务端进程必须是Service


aidl解决两个项目间通讯(IPC进程间通讯)一个项目里必须有service。另一个项目的activity调用service里的方法需要通过一个共有的接口

步骤:
1.在_b项目中创建一个接口,里面的方法是_b中service里面的内部类Mybinder的binderplay()方法
2.到文件夹的目录里把创建的这个接口改后缀名为.aidl
3.去掉接口的public修饰
4.会在_b的gen目录下生成一个.java的接口文件,把这个拷贝到_a的项目里,两个必须是相同的包名。
5.在_b的内部类Mybinder中继承这个接口.stub
6.在_a的activity的onServiceConnected()方法里,把传来的service强制转换成接口类型
   例:mbinder = IMybinder.Stub.asInterface(service);
7.就可以用生成mbinder对象来调用service中的方法


代码如下:

_b项目中创建接口:

package com.example.ex0729_aidl_b;
interface IMybinder
{
    void binderplay();
    void binderstop();
}

_b项目中的sevice代码:

public class MyService extends Service
{
    class Mybinder extends IMybinder.Stub
    {
        public void binderplay()
        {
            MyService.this.play();
        }
        public void binderstop()
        {
            MyService.this.stop();
        }
    }
    public MyService()
    {
    }
    @Override
    public void onCreate()
    {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.e("MyService", "onCreate");
    }
    @Override
    public void onDestroy()
    {
        Log.e("MyService", "onDestroy");
        super.onDestroy();
    }
    @Override
    public boolean onUnbind(Intent intent)
    {
        // TODO Auto-generated method stub
        Log.e("MyService", "onUnbind");
        return super.onUnbind(intent);
    }
    @Override
    public IBinder onBind(Intent intent)
    {
        Log.e("MyService", "onBind");
        return new Mybinder();
    }
    private void play()
    {
        Log.e("MyService", "play()");
    }
    public void stop()
    {
        Log.e("MyService", "stop()");
    }
}


_a项目中的Activity里代码:

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.button3);
        Button button4 = (Button) findViewById(R.id.button4);
        conn = new ServiceConnection()
        {
            @Override
            public void onServiceDisconnected(ComponentName name)
            {
                // TODO Auto-generated method stub
                  
            }
              
            @Override
            public void onServiceConnected(ComponentName name, IBinder service)
            {
                Log.e("MainActivity", service.toString());
                mbinder = IMybinder.Stub.asInterface(service);
            }
        };
        button1.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.setAction("com.example.ex0729_aidl_b");//通过隐式意图绑定Service
                bindService(intent , conn, BIND_AUTO_CREATE);
            }
        });
        button2.setOnClickListener(new OnClickListener()
        {
              
            @Override
            public void onClick(View v)
            {
                unbindService(conn);
            }
        });
        button3.setOnClickListener(new OnClickListener()
        {
              
            @Override
            public void onClick(View v)
            {
                try
                {
                    mbinder.binderplay();
                }
                catch (RemoteException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        button4.setOnClickListener(new OnClickListener()
        {
              
            @Override
            public void onClick(View v)
            {
                try
                {
                    mbinder.binderstop();
                }
                catch (RemoteException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }