一、整体工程图

二、messenger_service_binding.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent" android:layout_height="match_parent"> <TextView
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0"
android:paddingBottom="4dip"
android:text="@string/messenger_service_binding"/> <Button android:id="@+id/bind"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/bind_service">
<requestFocus />
</Button> <Button android:id="@+id/unbind"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/unbind_service">
</Button> <TextView android:id="@+id/callback"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0"
android:gravity="center_horizontal" android:paddingTop="4dip"/> </LinearLayout>

三、AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jltxgcy.messengerservice"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MessengerServiceActivities"
android:label="@string/title_activity_messenger_service" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MessengerService">
</service>
</application> </manifest>

四、MessengerServiceActivities.java

package com.jltxgcy.messengerservice;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MessengerServiceActivities extends Activity{ Messenger mServiceMessage = null;
boolean mIsBound;
TextView mCallbackText; class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MessengerService.MSG_SET_VALUE:
mCallbackText.setText("Received from service: " + msg.arg1);
break;
default:
super.handleMessage(msg);
}
}
} final Messenger mMessenger = new Messenger(new IncomingHandler()); private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
mServiceMessage = new Messenger(service);
mCallbackText.setText("Attached.");
try {
Message msg = Message.obtain(null,
MessengerService.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger; mServiceMessage.send(msg);
msg = Message.obtain(null,
MessengerService.MSG_SET_VALUE, this.hashCode(), 0);
mServiceMessage.send(msg);
} catch (RemoteException e) {
} } public void onServiceDisconnected(ComponentName className) {
mServiceMessage = null;
Log.d("jltxgcy", "onServiceDisconnected");
}
}; void doBindService() { bindService(new Intent(MessengerServiceActivities.this,
MessengerService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
} void doUnbindService() {
if (mIsBound) {
if (mServiceMessage != null) {
try {
Message msg = Message.obtain(null,
MessengerService.MSG_UNREGISTER_CLIENT);
msg.replyTo = mMessenger;
mServiceMessage.send(msg);
} catch (RemoteException e) {
}
} unbindService(mConnection);
mIsBound = false;
}
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.messenger_service_binding); Button button = (Button)findViewById(R.id.bind);
button.setOnClickListener(mBindListener);
button = (Button)findViewById(R.id.unbind);
button.setOnClickListener(mUnbindListener); mCallbackText = (TextView)findViewById(R.id.callback); } private OnClickListener mBindListener = new OnClickListener() {
public void onClick(View v) {
doBindService();
}
}; private OnClickListener mUnbindListener = new OnClickListener() {
public void onClick(View v) {
doUnbindService();
}
}; }

五、MessengerService.java

/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package com.jltxgcy.messengerservice; import java.util.ArrayList; import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast; public class MessengerService extends Service {
private ArrayList<Messenger> mClients = new ArrayList<Messenger>();
private int mValue = 0; public static final String TAG = "jltxgcy"; public static final int MSG_REGISTER_CLIENT = 1; public static final int MSG_UNREGISTER_CLIENT = 2; public static final int MSG_SET_VALUE = 3; class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
mClients.remove(msg.replyTo);
break;
case MSG_SET_VALUE:
mValue = msg.arg1;
for (int i=mClients.size()-1; i>=0; i--) {
try {
mClients.get(i).send(Message.obtain(null,
MSG_SET_VALUE, mValue, 0));
} catch (RemoteException e) {
mClients.remove(i);
}
}
break;
default:
super.handleMessage(msg);
}
}
} final Messenger mMessenger = new Messenger(new IncomingHandler()); @Override
public void onCreate() {
Log.d(TAG, "onCreate");
} @Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
} @Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return mMessenger.getBinder();
} @Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind");
return super.onUnbind(intent);
} }

六、详解

点击Bind Service,Logcat显示如下:

Service中:final Messenger mMessenger = new Messenger(new IncomingHandler());      onBind方法中mMessenger.getBinder()

Activity中, final Messenger mMessenger = new Messenger(new IncomingHandler());     onServiceConnected中mServiceMessage = new Messenger(service);

onBind方法中返回一个IBinder对象,onServiceConnected中,通过IBinder对象获取到了Messager对象。再通过msg.replyTo建立通信。

点击Unbind Service,Logcat显示如下:

运行结果如下:

获取message的方法:

          1、Message msg =new Message();
msg.arg1=x;
msg.arg2=x;
msg.obj=x;
msg.replyTo=x;
msg.what=x;
msg.setData(Bundle bundle);
2、Message msg =Messge.obtain(Handler h, int what, int arg1, int arg2, Object obj);
msg.replyTo=x;
msg.setData(Bundle bundle);

MessagerService总结的更多相关文章

  1. Android面试,与Service交互方式

    五种交互方式,分别是:通过广播交互.通过共享文件交互.通过Messenger(信使)交互.通过自定义接口交互.通过AIDL交互.(可能更多) Service与Thread的区别 Thread:Thre ...

  2. SpringBoot | 第三十八章:基于RabbitMQ实现消息延迟队列方案

    前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知 ...

  3. android 应用程序与服务端交互

    http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547765.html 简述了Service的一些基础知识以及Service和Thread ...

随机推荐

  1. linux网络配置相关文件

    网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...

  2. 线性时间构造普吕弗(Prüfer)序列

    tree -> sequence 首先预处理数组 deg[N], deg[i]表示编号为i的节点的度数,我们每次要删除的节点肯定是 满足deg[i]=1 的编号最小节点, 首先找到所有叶子并选出 ...

  3. C 编程调试集

    gcc rw.c rw.c:75:6: warning: conflicting types for ‘process_conn_server’ void process_conn_server(in ...

  4. PHP设计模式笔记八:原型模式 -- Rango韩老师 http://www.imooc.com/learn/236

    原型模式 概述: 1.与工厂模式作用类似,都是用来创建对象 2.与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作 3 ...

  5. Android中获取网页表单中的数据实现思路及代码

    在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...

  6. java 版本SQLHelper

    package com.jack.SQLHelper; import java.sql.*;import java.util.logging.*;import javax.swing.table.*; ...

  7. 奔五的人学IOS:swift练手与csdn,最近学习总结

    早在五月份就准备開始学习ios开发,当时还是oc,学习了几天,最终不得其法.到了ios8开放,再加swift的出现.从10月份開始.最终找到了一些技巧,学习起来还算略有心得. 今天把我在学习swift ...

  8. 可失败构造器(Failable Initializers)

    Xcode6.1中Swift的最新版本是1.1,在该版本中引入了一个新的特性:可失败构造器.通过构造器初始化实际上是给class或struct的每一个存储属性(参数)提供初始值,进行对象实例化的过程. ...

  9. jquery获取当前元素坐标

    1. jquery获取当前元素坐标 A) 获取对象

  10. Request.Params用法

    使用Request.Params["id"]来获取参数是一种比较有效的途径.有三种方式可以进行参数传递:(1). Form (2). ?id= (3).cookierequest. ...