很久以前就应该写这篇文章了,但是之前一直有事情,今天终于有时间了,因为android不允许共享内存,所以出现了AIDL(全称是Android Interface Define Language)也就是进程间通信,其实进程间通信也不麻烦,这里说说大概的思路,首先在服务器端口,我们写一个aidl的文件,文件里面通过接口的形式来写,但是没有限定词,(不要担心,代码会在后面贴出),然后android系统会根据这个文件在gen目录生成对应的java文件,然后我们写一个service,这个service里面需要实现之前对应生成的java文件里面的stub类,然后我们通过service里面的onbind函数,返回实现了stub类的方法的对象,在我们的客户端我们通过ServiceConnection来获得我们返回的对象,我们可以通过这个对象来调用我们之前定义在aidl文件中的方法,这里还需要提醒一下,需要在服务器端申明service,毕竟四大组件是很厉害的,可以贴代码了:
工程目录
aidl
package com.jk.aidlservice; interface IMyService { String getValue(String s); }自动生成的代码就不贴了,上面的代码一旦保存以后就会生成IMyService
MyService
package com.jk.aidlservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class MyService extends Service { // 我们需要返回的类的类型 public class MyServiceImpl extends IMyService.Stub { @Override public String getValue(String s) throws RemoteException { return s + "欢迎来到季科的博客"; } } @Override public IBinder onBind(Intent intent) { // 返回我们需要返回的类的对象 return new MyServiceImpl(); } }服务器的主程序里面什么也没有就不写了
完成这步以后我们需要申明service
<service android:name="com.jk.aidlservice.MyService"> <intent-filter > <action android:name="com.jk.aidl.service.Myservice"/> </intent-filter> </service>
然后我们需要将服务器里面的Myservice和IMyService带同包名一起复制到客户端,这里也可以想到,因为我们需要共同的接口,
最后,我们需要写主程序
package com.example.aidlclient; import com.jk.aidlservice.IMyService; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { public Button btn_show; public IMyService myService; // 通过ServiceConnection来获得返回的IBinder对象 public ServiceConnection myServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // 得到从客户端返回的对象 myService = IMyService.Stub.asInterface(service); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 启动服务 bindService(new Intent("com.jk.aidl.service.Myservice"), myServiceConnection, Context.BIND_AUTO_CREATE); // 获得按钮 btn_show = (Button) findViewById(R.id.btn_show); // 添加按钮点击事件 btn_show.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { // 调用myservice对象的函数 Toast.makeText(MainActivity.this, myService.getValue("ni"), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } }