远程服务往往不只是传递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. HTTP MIME类型即HttpResponse.ContentType属性值列表

    MIME-Typ Dateiendung(en) Bedeutung application/acad *.dwg AutoCAD-Dateien (nach NCSA) application/ap ...

  2. 浅谈HTTPS安全性

    各位可曾有过使用智能手机App在网络商店购物的经验,想必是有的,那你/妳会不会担心不够安全呢?有人会说放心吧,购物网站有使用SSL/TLS加密传输,我们就来聊聊HTTPS好了. 客户端与服务器端的交握 ...

  3. EPPB also support BlackBerry device

    各位看倌不是小弟要賣弄英文,實在是外國朋友希望知道上一篇"雲取證"中所用的工具Elcomsoft Phone Password Breaker支援黑莓機否?又要求非要看到截屏才算數 ...

  4. leetcode 119

    119. Pascal's Triangle II Given an index k, return the kth row of the Pascal's triangle. For example ...

  5. 七个你可能不了解的CSS单位

    我们很容易无法摆脱的使用我们所熟悉的CSS技术,当新的问题出现,这样会使我们处于不利的地位. 随着Web继续的发展,对新的解决方案的需求也会继续增大.因此,作为网页设计师和前端开发人员,我们别无选择, ...

  6. PDM文件编辑

    需要把Oracle中的表,导出到已有的PDM文件中. 1.Oracle导出表脚本 1) 2) 3) 2.PowerDesigner导入脚本 1) 2) 3) 4)

  7. javaSE第十四天

    第十四天    92 1. 正则表达式(理解)    92 (1)定义:    92 (2)常见规则    92 A:字符    92 B:字符类    93 C:预定义字符类    93 D:边界匹 ...

  8. 常用的MyEclipse快捷键

    在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当需要恢复代码功能的时候,又可以用Ctrl+/ 去掉注释.这 ...

  9. 举例详解CSS中的的优先级

    计算优先级 优先级是根据由每种选择器类型构成的级联字串计算而成的.他是一个对应匹配表达式的权重. 如果优先级相同,靠后的 CSS 会应用到元素上. 注意:元素在文档树中的位置是不会影响优先级的优先级顺 ...

  10. 调试工具-fiddler

    本地资源替换线上调试 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网 之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html ...