Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!
不需要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)!的更多相关文章
- android 史上最简单易懂的跨进程通讯(Messenger)!
		
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
 - Android为TV端助力 不需要Socket的跨进程推送消息AIDL!
		
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
 - Android为TV端助力 转载自jguangyou的博客,XML基本属性大全
		
android:layout_width 指定组件布局宽度 android:layout_height 指定组件布局高度 android:alpha 设置组件透明度 android:backgroun ...
 - Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)
		
前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...
 - Android为TV端助力(转载)
		
作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...
 - Android为TV端助力之Webview与JS双向交互
		
package com.hhzt.iptv.adservice; import android.app.Activity;import android.graphics.Bitmap;import a ...
 - Android为TV端助力:(转载)修改TextView字体样式
		
一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...
 - Android为TV端助力 listview与recyclerview上下联动
		
首先是主布局fragment里面的xml文件 <?xml version="1.0" encoding="utf-8"?><RelativeL ...
 - Android为TV端助力 转载:RecyclerView分页加载
		
package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...
 
随机推荐
- 简介 - MongoDB
			
1- NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL": NoSQL是指非关系型的数据库,有时也称作Not Only SQL的缩写, ...
 - Scala - 快速学习06 - 面向对象
			
1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...
 - Zookeeper 集群安装配置,超详细,速度收藏!
			
今天,栈长分享下 Zookeeper 的集群安装及配置. 下载 下载地址:http://zookeeper.apache.org/ 下载过程就不说了,我们下载了最新的zookeeper-3.4.11. ...
 - 【Spark调优】内存模型与参数调优
			
[Spark内存模型] Spark在一个executor中的内存分为3块:storage内存.execution内存.other内存. 1. storage内存:存储broadcast,cache,p ...
 - Android--UI之ViewStub
			
前言 按照最近博客的路线,继续讲Android的UI开发.今天讲解一下ViewStub控件,惰性装载控件.在本篇博客中,将了解到ViewStub的常用属性.方法,以及注意事项.最后将以一个简单的Dem ...
 - 浅谈Mybatis连接原理
			
众所周知数据库连接的过程,但是最近面试的人(菜面菜),都说用的SSM框架,但是我问了一下,mybatis是怎么连接上mysql的,基本上都会说:配置好的,直接用了,今天我来抛砖引玉一下,欢迎拍砖! 什 ...
 - spring-boot(六) 邮件服务
			
学习文章来自:springboot(十):邮件服务 简单使用 1.pom包配置 pom包里面添加spring-boot-starter-mail包引用 <dependencies> < ...
 - spring-boot-2.0.3之quartz集成,数据源问题,源码探究
			
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...
 - python json模块出现Invalid control character这个异常的原因
			
今天在查看日志的时候,发现一个问题,觉得很奇怪,跑了一个多月的代码突然报错了,还是个没见过的错误. 所以今晚抽空记录下. 一.重现错误 说好的传过来的数据是json格式的呢?怎么会突然报错了呢? 二. ...
 - [THUWC2017] 在美妙的数学王国畅游
			
Description 懒得概括了.. Solution 挺裸的LCT+挺裸的泰勒展开吧... 稍微了解过一点的人应该都能很快切掉...吧? 就是把每个点的函数泰勒展开一下然后LCT维护子树sum就行 ...