Android aidl实现两个apk之间远程调用Service(3)

下面我们开始client project。

client project比较简单,需要注意的地方是,首先需要把server project中gen文件夹中aidl生成的那个IAidlService.java类以及包都拷贝到我们的client project中。

(注意:client project的包名为com.ds.client;另外一个包名com.ds.server以及这个server包下面的IAidlService.java类都是从server project的gen文件夹拷贝过来的,至于gen文件夹的其他文件就不需要拷贝过来。 )

好了,这样的话,client project只要从activity去远程调用service就好了,实现代码如下:

package com.ds.client;       import com.ds.server.IAidlService;       import Android.app.Activity;    import android.content.ComponentName;    import android.content.Intent;    import android.content.ServiceConnection;    import android.os.Bundle;    import android.os.IBinder;    import android.os.RemoteException;    import android.util.Log;    import android.view.View;    import android.view.View.OnClickListener;    import android.widget.Button;    import android.widget.TextView;       public class AidlClientActivity extends Activity {           IAidlService iservice;            private ServiceConnection connection = new ServiceConnection() {               public void onServiceConnected(ComponentName name, IBinder service) {                // TODO Auto-generated method stub                // 从远程service中获得AIDL实例化对象                iservice = IAidlService.Stub.asInterface(service);                Log.i("Client","Bind Success:" + iservice);            }                 public void onServiceDisconnected(ComponentName name) {                // TODO Auto-generated method stub                iservice = null;                Log.i("Client","onServiceDisconnected");            }        };                /** Called when the activity is first created. */       @Override       public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);            setContentView(R.layout.main);            final TextView tv = (TextView) findViewById(R.id.tv);            Button bt = (Button) findViewById(R.id.bt);            bt.setOnClickListener(new OnClickListener() {                                   @Override               public void onClick(View arg0) {                    // TODO Auto-generated method stub                    Intent service = new Intent(IAidlService.class.getName());                    bindService(service, connection, BIND_AUTO_CREATE);                    if (iservice != null) {                          try {                            tv.setText("" + iservice.getType());                        } catch (RemoteException e) {                            e.printStackTrace();                        }                    }                   }               });           }    }  

注意几点:

1,import com.ds.server.IAidlService;使用的是我们拷贝过来的IAidlService.java类

2,需要一个ServiceConnection对象

3,通过Intent service = new Intent(IAidlService.class.getName());

bindService(service, connection, BIND_AUTO_CREATE);来bind service。这样就可以调用aidl中定义的接口来获取service中的值了。

唉,由于在使用中没有注意拷贝server project中gen文件夹下面的包和IAidlService.java,老是出现Unable to start service Intent这样的错误。搞了好久。

附件是源码。注意使用的时候,先要运行server project,启动服务,然后再运行client project。

免费下载地址在

用户名与密码都是

具体下载目录在 /2012年资料/6月/18日/Android aidl实现两个apk之间远程调用Service/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psjwf.html