您的位置:首页 > 移动开发 > Android开发

android学习之AIDL初探

2016-05-11 18:56 489 查看
很久以前就应该写这篇文章了,但是之前一直有事情,今天终于有时间了,因为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();
}
}
});

}

}


这样就完成了程序间的通信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: