android AIDL的一些写法
来源:互联网 发布:同步助手数据还原 编辑:程序博客网 时间:2024/05/22 17:11
Service这边只要定义一个服务:
<service android:name=".BaseTypeService"> <intent-filter > <action android:name="cn.bgxt.Service.BASE_TYPE_SERVICE"/> </intent-filter> </service>
对于传递的是基本类型:创建要传递的数据类型:
interface IDog{String getName();int getAge();}
然后在服务器的Service上创建Stub,Stub是存根的意思,在客户端也有一个一样的IDog类,通信的时候传递的都是IDog类型:
服务端Service的写法:
import com.example.aidlservicedemo.domain.IDog.Stub;
public class BaseTypeService extends Service {private final String TAG="main";private DogBinder binder=null;private String[] names=new String[]{"小白","旺财","小黑"};private int[] ages=new int[]{1,2,3};/** * Stub的实现类,Stub内部实现了Binder * 内部实现AIDL定义的方法 */public class DogBinder extends Stub{@Overridepublic String getName() throws RemoteException {<strong>return names[0];</strong>}@Overridepublic int getAge() throws RemoteException {<strong>return ages[1];</strong>}}@Overridepublic void onCreate() {super.onCreate();// 实例化Binder对象binder=new DogBinder();Log.i(TAG, "创建服务成功");}@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "绑定服务成功");// 返回Binder对象return binder;}}
客户端这样来调用:
public class BaseTypeActivity extends Activity {private Button btn_startService, btn_endService,btn_getServiceData;private IDog dogService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_service);btn_startService = (Button) findViewById(R.id.btn_startService);btn_endService = (Button) findViewById(R.id.btn_endService);btn_getServiceData = (Button) findViewById(R.id.btn_getServiceData);btn_startService.setOnClickListener(click);btn_endService.setOnClickListener(click);btn_getServiceData.setOnClickListener(click);}private View.OnClickListener click = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_startService:startService();break;case R.id.btn_endService:endService();break;case R.id.btn_getServiceData:getServiceDate();break;}}};/* * 获取数据 */private void getServiceDate() {try {if(dogService!=null){<strong>StringBuilder sBuilder=new StringBuilder();sBuilder.append("name:"+dogService.getName());sBuilder.append("\nage:"+dogService.getAge());//获取数据,这个结果应该是小白,2</strong>Toast.makeText(BaseTypeActivity.this, sBuilder.toString(), Toast.LENGTH_SHORT).show();}else{Toast.makeText(BaseTypeActivity.this, "请先绑定服务", Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}}private ServiceConnection connBase=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {dogService=null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// IDog.Stub.asInterface,获取接口<strong>dogService=IDog.Stub.asInterface(service);//表示拿到的这个Service对象</strong>}};/** * 开始服务 */private void startService(){<strong>Intent intent=new Intent();intent.setAction("cn.bgxt.Service.BASE_TYPE_SERVICE");//这个必须跟服务端menufest上的action一致bindService(intent, connBase, BIND_AUTO_CREATE);Toast.makeText(BaseTypeActivity.this, "开始绑定服务", Toast.LENGTH_SHORT).show();</strong>}/** * 停止服务 */private void endService(){if(connBase!=null){unbindService(connBase);Toast.makeText(BaseTypeActivity.this, "服务解除绑定", Toast.LENGTH_SHORT).show();}}}
如果AIDL通讯传递是自定义类型:
一个常用的根据user来返回对象message信息的例子,user ,message都是自定义类型:
public class Message implements Parcelable {private int id;private String msgText;private String fromName;private String date;}public class User implements Parcelable {private int id;private String username;private String password;}
定义两个AIDL文件
message.aidl:
parcelable Message;
user.aidl
parcelable User;
服务器代码:
public class CustomTypeService extends Service {private static final String TAG = "main";private MsgBinder msgBinder = null;private static Map<User, List<Message>> map = new HashMap<User, List<Message>>();static {for (int i = 0; i < 3; i++) {User user = new User(i, "jack" + i, "99" + i);List<Message> messages = new ArrayList<Message>();Message msg = null;if (i == 0) {msg = new Message(i, "这两天好吗?", "Jerry",new Date().toGMTString());messages.add(msg);}map.put(user, messages);}}public class MsgBinder extends Stub {@Overridepublic List<Message> getMes(User us) throws RemoteException {for (Map.Entry<User, List<Message>> msgs : map.entrySet()) {if (msgs.getKey().getUsername().equals(us.getUsername())&& msgs.getKey().getPassword().equals(us.getPassword())) {Log.i(TAG, "找到信息了");return msgs.getValue();}}Log.i(TAG, "没找到信息了");return map.get(us);}}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn msgBinder;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();msgBinder = new MsgBinder();}@Overridepublic void onDestroy() {msgBinder = null;super.onDestroy();}}
客户端基本是一致的:
private static User[] users = new User[] {new User(0, "jack0", "990")};/** * 获取其他线程服务数据 */private void getServiceDate(){try {List<Message> msgs=getMsg.getMes(users[0]);StringBuilder sBuilder=new StringBuilder();for(Message msg:msgs){sBuilder.append(msg.toString()+"\n");}Toast.makeText(CustomTypeActivity.this, sBuilder.toString(), Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(CustomTypeActivity.this, "获取数据出错", Toast.LENGTH_SHORT).show();e.printStackTrace();}}
0 0
- android AIDL的一些写法
- AIDL的一般写法
- Android使用AIDL时传递复杂数据对象的写法
- Android Aidl遇到的一些问题
- AIDL 写法
- android 一些路径的标准写法
- android 一些路径的标准写法
- android 一些路径的标准写法
- android AIDL的基本知识
- android aidl的建立
- android aidl的使用
- android 简单的aidl
- Android AIDL的使用
- android 简单的aidl
- android AIDL的使用
- Android AIDL的应用
- Android Aidl 的使用方法
- android aidl的调用
- Qemu Vhost Block架构分析(下)
- CMake 手册详解(21-23)
- Java中用正则表达式找出数字
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- CentOS安装mysql
- android AIDL的一些写法
- SSH框架总结(框架分析+环境搭建+实例源码下载)
- 就低功耗看到过黑客帝国回克
- 浅谈servlet的生命周期
- 应用程序分享 小工具
- http响应Last-Modified和ETag
- $().attr()的用法 && $().html()与$().text()的区别
- java多线程-多线程同步代码块-银行存款实例-锁synchronized
- 成低功耗看到过黑客帝国回克