android Service Activity交互之传递复杂数据类型的远程服务
远程服务往往不只是传递java基本数据类型。这时需要注意android的一些限制和规定:
- android支持String和CharSequence
- 如果需要在aidl中使用其他aidl接口类型,需要import,即使是在相同包结构下;
- android允许传递实现Parcelable接口的类,需要import;
- android支持集合接口类型List和Map,但是有一些限制,元素必须是基本型或者上述三种情况,不需要import集合接口类,但是需要对元素涉及到的类型import;
- 非基本数据类型,也不是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交互之传递复杂数据类型的远程服务的更多相关文章
- android Service Activity三种交互方式(付源码)
android SDK提供了Service,用于类似Linix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service):用于应用程序内部 远程服务(Rem ...
- android Service Activity三种交互方式(付源码)(转)
android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread android Service Binder交互通信实例 最下边有源代码: ...
- Android——不同activity之间数据传递
/* * 不同activity之间数据的传递 */ public class MainActivity extends Activity { private EditText et_name; @Ov ...
- android 不同Activity之间数据传递
1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.a ...
- android service 本地 远程 总结
android编写Service入门 android SDK提供了Service,用于类似*nix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service) ...
- Service Activity三种交互方式
Service Activity三种交互方式 2012-09-09 22:52 4013人阅读 评论(2) 收藏 举报 serviceandroidimportclassthreadjava ...
- Android Service与Activity的交互
Android中有时候需要在Service中改变Activity的UI,或者在Activity中修改Service中的数值.首先必须使用与Activity绑定的Service,有三种方式可以实现.第一 ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- android 入门-Service实时向Activity通过BroadcastReceiver传递数据
引文: http://www.cnblogs.com/linjiqin/p/3147764.html <RelativeLayout xmlns:android="http://sch ...
随机推荐
- HTTP MIME类型即HttpResponse.ContentType属性值列表
MIME-Typ Dateiendung(en) Bedeutung application/acad *.dwg AutoCAD-Dateien (nach NCSA) application/ap ...
- 浅谈HTTPS安全性
各位可曾有过使用智能手机App在网络商店购物的经验,想必是有的,那你/妳会不会担心不够安全呢?有人会说放心吧,购物网站有使用SSL/TLS加密传输,我们就来聊聊HTTPS好了. 客户端与服务器端的交握 ...
- EPPB also support BlackBerry device
各位看倌不是小弟要賣弄英文,實在是外國朋友希望知道上一篇"雲取證"中所用的工具Elcomsoft Phone Password Breaker支援黑莓機否?又要求非要看到截屏才算數 ...
- leetcode 119
119. Pascal's Triangle II Given an index k, return the kth row of the Pascal's triangle. For example ...
- 七个你可能不了解的CSS单位
我们很容易无法摆脱的使用我们所熟悉的CSS技术,当新的问题出现,这样会使我们处于不利的地位. 随着Web继续的发展,对新的解决方案的需求也会继续增大.因此,作为网页设计师和前端开发人员,我们别无选择, ...
- PDM文件编辑
需要把Oracle中的表,导出到已有的PDM文件中. 1.Oracle导出表脚本 1) 2) 3) 2.PowerDesigner导入脚本 1) 2) 3) 4)
- javaSE第十四天
第十四天 92 1. 正则表达式(理解) 92 (1)定义: 92 (2)常见规则 92 A:字符 92 B:字符类 93 C:预定义字符类 93 D:边界匹 ...
- 常用的MyEclipse快捷键
在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当需要恢复代码功能的时候,又可以用Ctrl+/ 去掉注释.这 ...
- 举例详解CSS中的的优先级
计算优先级 优先级是根据由每种选择器类型构成的级联字串计算而成的.他是一个对应匹配表达式的权重. 如果优先级相同,靠后的 CSS 会应用到元素上. 注意:元素在文档树中的位置是不会影响优先级的优先级顺 ...
- 调试工具-fiddler
本地资源替换线上调试 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网 之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html ...