实现Android进程间通信实例有好几种方法:
1,AIDL
2,Broadcast
3,Intent
4,Content Provider
记录一下AIDL实现Android进程间通信的方式:
Android的AIDL进程间通信实现步骤:
一:创建AIDL服务端:aidl文件,自动生成的接口java文件,服务service
xxxInterface.aidl (远程服务的接口定义)
package com.example.aidltest; interface IMyAidlInterface { String getValue(); // 为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法 }
1,创建一个xxxInterface.aidl文件,文件中是一个接口的形式
2,Eclipse自动完成,根据你的xxxInterface.aidl文件,在gen内生成一个xxxInterface.java文件,真正的创建了xxxInterface中的接口,并创建内部类Stub( extends android.os.Binder)
AIDLtestService.java (远程服务的具体接口方法实现)
package com.example.aidltest; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class AIDLtestService extends Service { //Two choices: //1:内部类实现,创建一个内部类继承自IMyAidlTest.Stub(自动生成的一个IMyAidlTest内部类) //2:匿名类实现,创建一个IMyAidlTest.Stub对象,实现接口方法String getValue() //1,内部类 private MyAIDLimp aidlImp=new MyAIDLimp(); public class MyAIDLimp extends IMyAidlInterface.Stub { @Override public String getValue() throws RemoteException { // TODO Auto-generated method stub return "Hello World!"; } } //2,匿名类 private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){ public String getValue() throws RemoteException { return "Hello Zero!"; }; }; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub //返回这个实现了getValue方法的IMyAidlTest.Stub //return mBinder return aidlImp; } }
3,创建AIDL服务 (AIDLtestService extends Service)
4,在serveice中创建一个xxxInterface.Stub的对象,可以通过内部类或者匿名类实现。这个对象要实现所有具体的接口方法
5,在onbind()中
return 4中创建的xxxInterface.Stub的对象
AndroidManifest.xml
<service android:name="AIDLtestService"> <intent-filter> <action android:name="com.example.aidltest.AIDLtestService" /> </intent-filter> </service>
6,声明这个service,添加intent-filter中的action
二:客户端调用服务
远程的XXXActivity.java
</pre><p><pre name="code" class="java">package com.example.aidltest; import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.os.Build; public class MainActivity extends Activity { private Button btn ; private TextView tv; //创建IMyAidlInterface对象 private IMyAidlInterface myAidlInterface=null; //创建ServiceConnection对象 private ServiceConnection sc=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { // TODO Auto-generated method stub myAidlInterface = IMyAidlInterface.Stub.asInterface(arg1); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.button1); tv=(TextView)findViewById(R.id.textView1); //创建一个服务的intent,启动服务 Intent intent = new Intent(this,AIDLtestService.class); bindService(intent, sc,Context.BIND_AUTO_CREATE); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub try { //通过IMyAidlInterface的对象调用远程服务 String s= myAidlInterface.getValue(); System.out.println(s); tv.setText(s); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } }
1,创建xxxInterface对象myInterface,创建ServiceConnection对象sc,在sc的onServiceConnected方法中实例化xxxInterface对象。
sc是在之后bindService中使用。
myInterface是之后调用服务进程的对象。
2,创建一个服务的Intent,用这个Intent启动远程服务器的service---AIDLtestService
3,bindService(intent, sc,Context.BIND_AUTO_CREATE);
4,通过myInterface调用远程服务。