远程服务往往不只是传递java基本数据类型。这时需要注意android的一些限制和规定:

  1. android支持String和CharSequence
  2. 如果需要在aidl中使用其他aidl接口类型,需要import,即使是在相同包结构下;
  3. android允许传递实现Parcelable接口的类,需要import;
  4. android支持集合接口类型List和Map,但是有一些限制,元素必须是基本型或者上述三种情况,不需要import集合接口类,但是需要对元素涉及到的类型import;
  5. 非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。

举例

 package com.mooger.message;

 import android.os.Parcel;
import android.os.Parcelable; public class SkyMessage implements Parcelable {
public String floder;
public int aid;
public long delay;
public String head;
public String body;
public String foot; public SkyMessage(String floder ,int aid ,long delay ,String head ,String body ,String foot)
{
this.floder = floder;
this.aid = aid;
this.delay = delay;
this.head = head;
this.body = body;
this.foot = foot;
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(floder);
dest.writeInt(aid);
dest.writeLong(delay);
dest.writeString(head);
dest.writeString(body);
dest.writeString(foot);
} public static final Parcelable.Creator<SkyMessage> CREATOR = new Parcelable.Creator<SkyMessage>(){
@Override
public SkyMessage createFromParcel(Parcel source) {
return new SkyMessage(source.readString() ,source.readInt() ,source.readInt() ,source.readString() ,source.readString() ,source.readString());
} @Override
public SkyMessage[] newArray(int size) {
return new SkyMessage[size];
}
}; }

然后,需要在相同包下建一个同名的aidl文件,用于android生成相应的辅助文件:

 package com.mooger.message;

 parcelable SkyMessage;

下面是两个aidl文件

SkyActivity.aidl

 package com.mooger.aidl;

 interface SkyActivity{
void downloadstate(String TAG ,int AID);
}

SkyService.aidl

 package com.mooger.aidl;

 import com.mooger.aidl.SkyActivity;
import com.mooger.message.SkyMessage; interface SkyService{
void download(String download_url ,String Appname ,int download_size ,int AID ,String floder);
void request(int time);
void registerSkyCall(SkyActivity at);
void creatAd(in SkyMessage message);
}

在自己service类里实现一个内部类继承SkyService并实现相应的方法

     public class ServiceBinder extends SkyService.Stub{

         @Override
public void download(String download_url, String Appname,
int download_size, int AID ,String floder) throws RemoteException {
// TODO Auto-generated method stub
.....
} @Override
public void registerSkyCall(SkyActivity at) throws RemoteException {
// TODO Auto-generated method stub
......
} @Override
public void request(int time) throws RemoteException {
// TODO Auto-generated method stub
.......
} @Override
public void creatAd(SkyMessage message) throws RemoteException {
// TODO Auto-generated method stub
.........
}
}

创建 ServiceBinder 实例

 private ServiceBinder serviceBinder = new ServiceBinder();

并在onBind方法中返回实例

 @Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "Service onBind");
return serviceBinder;
}

在activity中实例化一个ServiceConnection对象并实现相应方法

     private SkyService downloadService;

     private ServiceConnection serviceConnection = new ServiceConnection(){

         @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.d("BootStart","activity onServiceConnected");
downloadService = SkyService.Stub.asInterface(service);
try {
downloadService.registerSkyCall(AtCallback);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
downloadService = null;
} };

最后通过bindService方法实现绑定

 this.bindService(new Intent("com.mooger.aidl.Service"), this.serviceConnection, BIND_AUTO_CREATE);//绑定到服务

AndroidManifest.xml 中的service设置

 <service android:name="com.mooger.service_133.MooService"         android:label="@string/service_name"
android:icon="@drawable/ic_launcher">
<intent-filter>
<action android:name="com.mooger.aidl.Service" />
</intent-filter>
</service>

这样就完成了基本的设置和部署,通信传递数据只要向下面的例子代码即可

 SkyMessage message = new SkyMessage(folder, jsonObj.optInt("aid"), jsonObj.optLong("delay"), jsonObj.optString("head"), jsonObj.optString("body"), jsonObj.optString("foot"));
try {
downloadService.creatAd(message);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

android Service Activity交互之传递复杂数据类型的远程服务的更多相关文章

  1. android Service Activity三种交互方式(付源码)

    android SDK提供了Service,用于类似Linix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service):用于应用程序内部 远程服务(Rem ...

  2. android Service Activity三种交互方式(付源码)(转)

    android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread  android Service Binder交互通信实例 最下边有源代码: ...

  3. Android——不同activity之间数据传递

    /* * 不同activity之间数据的传递 */ public class MainActivity extends Activity { private EditText et_name; @Ov ...

  4. android 不同Activity之间数据传递

    1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.a ...

  5. android service 本地 远程 总结

    android编写Service入门 android SDK提供了Service,用于类似*nix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service) ...

  6. Service Activity三种交互方式

    Service Activity三种交互方式 2012-09-09 22:52 4013人阅读 评论(2) 收藏 举报 serviceandroidimportclassthreadjava     ...

  7. Android Service与Activity的交互

    Android中有时候需要在Service中改变Activity的UI,或者在Activity中修改Service中的数值.首先必须使用与Activity绑定的Service,有三种方式可以实现.第一 ...

  8. Android—Service与Activity的交互

    service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...

  9. android 入门-Service实时向Activity通过BroadcastReceiver传递数据

    引文: http://www.cnblogs.com/linjiqin/p/3147764.html <RelativeLayout xmlns:android="http://sch ...

随机推荐

  1. Linux下的多进程编程

    1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统 ...

  2. 使用cnpm搭建企业内部私有NPM仓库

    cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案.它同时解决了现有npm架构的一些问题. 为什么企业需要私有NPM 主要有如下理由: 确保npm服务快速.稳定:对于企业来说,上线生产系统的时 ...

  3. java中使用mysql

    executeUpdate:是最基础的数据库的更新.插入和删除操作.效率低下.executeQuery:是最基础的执行查询语句,同样也是效率低下.execute:兼具上面二者的功能但返回一个boole ...

  4. Linux之通配符与转义字符

    通配符: *:代表任意字符,可以为空字符 ?:代表一个字符,不可以为空字符 转义字符: \

  5. Linux字符设备和块设备的区别

    系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块.最常见的块设备是硬盘,除此以外,还有软盘驱动器.CD-ROM驱动器和闪存等等许多其他块设备.注意 ...

  6. mvc路由设置参数配置类似于url重写

    1.新建的mvc项目中Global.asax 2.在另外一个控制器中的视图中 3. 4.

  7. 软件工程 speedsnail 第二次冲刺7

    20150524 完成任务:蜗牛碰到线后速度方向的调整: 遇到问题: 问题1 方向用到abs等函数,不熟悉 解决1 查看文档 明日任务: 蜗牛碰到线后速度方向的调整:(做优化)

  8. c语言学习第四天数据类型1

    int   代表整数,它在内存中占4个字节,二进制的表示方式是占用了三十二位,二进制中只包含0和1,那它的最大值就是全为1,但int是 有符号类型,所以最高位(左边的第一位)要拿出来做符号位,这样就只 ...

  9. php qr生成二维码

    二维码就是用在平面上用特定的几何图形记录数据信息的,QR码是常见的一种二维码.推荐使用生成QR码的php类库PHP QR Code. 例子: <?php   ini_set('display_e ...

  10. delphi中表示跳出的有break,continue, exit,abort, halt, runerror

      1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或repeat语句中强制退出. 2.continue 用于从For语句,while语句或repeat语句强行结束本次 ...