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; }