不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件!

只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通讯和传递数据。废话不多说,直接上代码。

首先是服务端:

public class Ser extends Service{
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.i("Service", "onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
public Messenger messenger = new Messenger(new MyHandler());
public class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Log.i("Ser---TAG", "msg::"+msg.arg1+"want :"+msg.getData().getString("msg"));
Messenger messenger = msg.replyTo;
Message message = Message.obtain(null, 0);
Bundle bundle = new Bundle();
bundle.putString("reply", "嗯,你的消息我已经收到,稍后回复你!");
message.setData(bundle);
try {
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
super.handleMessage(msg);
}
}

我们在服务端操作了并不多,仅仅是实例化了一个Messenger,并且创建了一个handler用来接收客户端发送过来的消息

接下来看客户端:

public class Client extends Service{
private static final String TAG = "Client";
protected Messenger mService;
public Handler handler = new Handler(){
public void handleMessage(Message msg) {
Log.i("client --- TAG", "msg:;"+msg.getData().getString("reply"));
};
};
public Messenger messenger = new Messenger(handler);
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent mIntent = new Intent();
mIntent.setClassName("com.example.test1", "com.example.test1.Ser");
bindService(mIntent, mBindService, Context.BIND_AUTO_CREATE);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
unbindService(mBindService);
}
private ServiceConnection mBindService = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Message message = Message.obtain(null, 0);
Bundle bundle = new Bundle();
bundle.putString("msg", "hello this is client!");
message.replyTo = messenger;
message.setData(bundle);
try {
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub

}
};
}

同样客户端也需要一个handler来接收服务端返回的消息,还有很关键的一点

当客户端发送消息的时候,需要把接收服务端回复的Messenger通过Message的

replyTo参数传递给服务端,否则会报NullPointerException。然后我们在看下log

"hello this is client!" 这是客户端发给服务端的,证明服务端已经收到!

"嗯,你的消息我已经收到,稍后回复你!" 这是服务端返回给客户端的,证明客户端也收到了,并且还是实时通讯哦,到此我们的跨进程传递数据通讯完整结束啦,是不是很简单!

Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!的更多相关文章

  1. android 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  2. Android为TV端助力 不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

  3. Android为TV端助力 转载自jguangyou的博客,XML基本属性大全

    android:layout_width 指定组件布局宽度 android:layout_height 指定组件布局高度 android:alpha 设置组件透明度 android:backgroun ...

  4. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  5. Android为TV端助力(转载)

    作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...

  6. Android为TV端助力之Webview与JS双向交互

    package com.hhzt.iptv.adservice; import android.app.Activity;import android.graphics.Bitmap;import a ...

  7. Android为TV端助力:(转载)修改TextView字体样式

    一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...

  8. Android为TV端助力 listview与recyclerview上下联动

    首先是主布局fragment里面的xml文件 <?xml version="1.0" encoding="utf-8"?><RelativeL ...

  9. Android为TV端助力 转载:RecyclerView分页加载

    package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...

随机推荐

  1. JDK9新特性实战:流关闭新姿势

    做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK6 在JDK ...

  2. 我面试过没有上万人也有十几个,简历要这么写才有hr要你

    今天终于有时间好好给大家写写关于如何写简历,给自己加分了. 这篇文章拖了很久了应该说,本来想在上周写的,但是事情实在是太多,又不想草草了事,所以搁置到现在.今天早上正好空出来了,就马上给大家码出来了. ...

  3. 整理了一周的Python资料,包含各阶段所需网站、项目,收藏了慢慢来

    这周应该有不少学校已经开学了,那么同学们都该动起来了,把家里面的那些懒习惯给扔掉了可以. 不知怎么的,最近不少关注我的读者都开始私信我怎么学好python?零基础转行是不是合适,还有希望吗?今年30了 ...

  4. Workspace in use or cannot be created, choose a different one.错误的解决办法

    eclipse 或 myeclipse 使用一段时间后,有时会因为一些故障自己就莫名奇妙的关闭了,再打开时有时没有问题,有时有会提示错误: Workspace Unavailable: Workspa ...

  5. [android学习]__使用百度地图开放api编写地图定位app

    前言 在前面我已经记录关于如何使用百度地图api,以及如何配置相关的androidstudio配置了,接下来将记录如何使用百度地图api开发简单的地图定位apk,我将决定不定期持续更新本篇笔记,在每个 ...

  6. HTTP的基本原理

    用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议 HTTP(HyperTextTransfer Protocol) 负责完成的. HTT ...

  7. 踏上编程大道 从 Python 开始成为神级 Coder

    电脑科学,或说计算机科学,是个在美国不断成长的产业,薪资报酬也很高.市场上永远存在著对天赋异禀的新锐工程师的需求,这就是为什麽「学习程式语言」一直是一件有魅力的事情. 但是,就跟任何技能一样,我们常常 ...

  8. Ansible基础认识及安装使用详解(week5_day1_part1)--技术流ken

    Ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量 ...

  9. JS-面向对象编程-对象方法添加属性

    A-对象扩展属性及方法: obj.属性名=属性值 obj[属性名]=属性值 方式一: var obj={}; obj.Name="liming"; obj.Age="27 ...

  10. C# 显式转换关键字 explicit

    不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...