android学习之AIDL初探

来源:互联网 发布:godaddy 域名续费 编辑:程序博客网 时间:2024/04/28 04:47

很久以前就应该写这篇文章了,但是之前一直有事情,今天终于有时间了,因为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 {@Overridepublic String getValue(String s) throws RemoteException {return s + "欢迎来到季科的博客";}}@Overridepublic 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() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 得到从客户端返回的对象myService = IMyService.Stub.asInterface(service);}};@Overrideprotected 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry {// 调用myservice对象的函数Toast.makeText(MainActivity.this, myService.getValue("ni"),Toast.LENGTH_SHORT).show();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}}

这样就完成了程序间的通信





0 0
原创粉丝点击