一、整体工程图

二、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. mysql sql优化<1>

    <pre name="code" class="html">explain SELECT t.* FROM ( SELECT t1.sn AS cl ...

  2. wan口mac=lan口mac加一,wlan是lan口mac加二

    (1)路由器有两个mac地址,一个用于外网(wan),一个用于内网(wlan和lan): (2)一般路由器上面或者配置路由器的网页上面只标注外网的mac地址: (3)内网的mac地址和外网mac地址一 ...

  3. spring framework 4 源码阅读(2)---从ClassPathXmlApplicationContext开始

    Application初始化日志 15:23:12.790 [main] DEBUG o.s.core.env.StandardEnvironment - Adding [systemProperti ...

  4. Linux调试工具strace和gdb常用命令小结

    strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...

  5. SWF加解密资源索引之加密混淆篇【转】

    ============================ SWF加解密资源索引之加密混淆篇 ============================ [心得] swf加密混淆器(带源码) http:/ ...

  6. 【剑指offer】面试题40:数组中只出现一次的数字

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...

  7. 符号表(Symbol Tables)

    小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查).拼写检查本身也是一个词典,只不过容量比较小.现实生活中有许多词典的应用: 拼写检查 数据库管理应用 ...

  8. python倒计时

    #coding=utf-8 #!/usr/bin/env python import datetime,time i=3 while i==3: spring=datetime.datetime(20 ...

  9. 改进的newlisp编译脚本,只需要配置

    前面有一篇Say bye to CMake and Makefile我开始用自己编写的newlisp脚本替代CMake,今天对前面的进行改进. 改进部分是: 1. newlisp armory模块的引 ...

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

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