<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=binder_%40_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice</id>
	<title>binder @ 用cpp实现一个service - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=binder_%40_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;action=history"/>
	<updated>2026-09-01T06:11:51Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;diff=831&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 11:56 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;diff=831&amp;oldid=prev"/>
		<updated>2015-05-06T11:56:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2015年5月6日 (三) 11:56的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l542&quot;&gt;第542行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第542行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;上述源码可从[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;http&lt;/del&gt;:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;//www.hovercool.com/upload/en/code/&lt;/del&gt;MyBinder.rar &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;这里&lt;/del&gt;]打包下载.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;上述源码可从[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[文件&lt;/ins&gt;:MyBinder.rar&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/ins&gt;]打包下载.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;diff=830&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 11:56 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;diff=830&amp;oldid=prev"/>
		<updated>2015-05-06T11:56:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2015年5月6日 (三) 11:56的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l21&quot;&gt;第21行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第21行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;各类继承关系图如下：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;各类继承关系图如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:binder_class.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;emf&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:binder_class.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jpg&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;这里所实现的service是模拟一个火炮，所提供的服务有“开火”、“检查剩余炮弹”和“装弹”。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;这里所实现的service是模拟一个火炮，所提供的服务有“开火”、“检查剩余炮弹”和“装弹”。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;diff=828&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 11:53 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=binder_@_%E7%94%A8cpp%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAservice&amp;diff=828&amp;oldid=prev"/>
		<updated>2015-05-06T11:53:49Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 一、前言 ==&lt;br /&gt;
&lt;br /&gt;
binder，是android中随处可见的IPC机制。&lt;br /&gt;
&lt;br /&gt;
关于其设计思想及设计原理可以认真研读一下这篇文章，写得很好：http://disanji.net/2011/02/28/android-bnder-design/&lt;br /&gt;
&lt;br /&gt;
不过在这里，我们不会去深研其实现原理，而是以一个应用开发者的角度，看一下如何使用它。&lt;br /&gt;
&lt;br /&gt;
IPC，即进程间通信，作用是使一个进程能够访问另一个并行进程的数据。而binder，从直观的角度上看来，更为简单，就是在一个进程中能够调用另一个进程的函数，就好像调用本地函数一样。&lt;br /&gt;
&lt;br /&gt;
== 二、概述 ==&lt;br /&gt;
&lt;br /&gt;
为了实现上面所说的“从一个进程‘调用’另一个进程的函数”，binder首先要求客户端和服务端都要定义一些相同的接口，然后给服务编号，在客户端要访问服务端某一服务时就通过这个编号来指定，同时在传递这个编号时也带有数据(int32、string、pointer)作为参数，数据的交换就通过这些参数实现。&lt;br /&gt;
&lt;br /&gt;
上面这些都很好理解，不过这还是没有说明核心——IPC的部分在哪？其实这部分和linux已有的IPC机制类似，就是将数据从用户空间通过linux driver写虚拟文件(/dev/binder)的方式，在内核空间实现。不过binder使用mmap将空间映射的方式作了优化，避免了内存分配、减少数据拷贝次数，具体可以查看上第一章推荐的那篇文章，里面有详细的描述。&lt;br /&gt;
&lt;br /&gt;
而对于“binder首先要求客户端和服务端都要定义一些相同的接口”的实现，相信有过面向对象基础的朋友们已经猜到了...&lt;br /&gt;
&lt;br /&gt;
——没错，正是采用继承共同的父类的方式实现！&lt;br /&gt;
&lt;br /&gt;
各类继承关系图如下：&lt;br /&gt;
&lt;br /&gt;
[[Image:binder_class.emf]]&lt;br /&gt;
&lt;br /&gt;
这里所实现的service是模拟一个火炮，所提供的服务有“开火”、“检查剩余炮弹”和“装弹”。&lt;br /&gt;
== 三、用C++实现一个service==&lt;br /&gt;
&lt;br /&gt;
=== 1、实现共同父类IMyBinder ===&lt;br /&gt;
&lt;br /&gt;
这个类除了要定义上面所说的函数外，还要定义一些binder内部使用的函数和变量。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//IMyBinder.h&lt;br /&gt;
&lt;br /&gt;
#ifndef I_MY_BINDER_H&lt;br /&gt;
#define I_MY_BINDER_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;binder/IInterface.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/IPermissionController.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Vector.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/String16.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
    class IMyBinder : public IInterface {&lt;br /&gt;
        public:&lt;br /&gt;
            DECLARE_META_INTERFACE(MyBinder);&lt;br /&gt;
&lt;br /&gt;
            virtual bool loadBomb(const int num) = 0;&lt;br /&gt;
            virtual int checkBomb(void) = 0;&lt;br /&gt;
            virtual bool fire(void) = 0;&lt;br /&gt;
&lt;br /&gt;
        enum {&lt;br /&gt;
            LOAD_BOMB_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,&lt;br /&gt;
            CHECK_BOMB_TRANSACTION,&lt;br /&gt;
            FIRE_TRANSACTION&lt;br /&gt;
        };&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
#endif /* I_MY_BINDER_H */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//IMyBinder.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;IMyBinder.h&amp;gt;&lt;br /&gt;
#include &amp;lt;BpMyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
    IMPLEMENT_META_INTERFACE(MyBinder, &amp;quot;IMyBinder&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2、实现BnMyBinder ===&lt;br /&gt;
&lt;br /&gt;
Bn中的首个字母B是代表binder，那第二字母代表什么意思呢？答案就是native，即表示这个类是在真正实现对应功能的进程中创建的。相对应的，下面将会说到的BpMyBinder中的p则是proxy的首字母，为代理的意思。&lt;br /&gt;
&lt;br /&gt;
在BnMyBinder中必须要实现的函数是 onTransact，因为所有的IPC服务调用都是通过这个函数、根据服务编号完成分发实现的。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//BnMyBinder.h&lt;br /&gt;
&lt;br /&gt;
#ifndef BN_MY_BINDER_H&lt;br /&gt;
#define BN_MY_BINDER_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;IMyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
    class BnMyBinder : public BnInterface&amp;lt;IMyBinder&amp;gt; {&lt;br /&gt;
        public:&lt;br /&gt;
            virtual status_t onTransact(uint32_t code,&lt;br /&gt;
                                        const Parcel&amp;amp; data,&lt;br /&gt;
                                        Parcel* reply,&lt;br /&gt;
                                        uint32_t flags = 0);&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
#endif /* BN_MY_BINDER */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//BnMyBinder.cpp&lt;br /&gt;
&lt;br /&gt;
#define LOG_TAG &amp;quot;BnMyBinder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*#include &amp;lt;binder/IPCThreadState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Log.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;private/android_filesystem_config.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/resource.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;BnMyBinder.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Debug.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Log.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/Parcel.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    status_t BnMyBinder::onTransact(&lt;br /&gt;
        uint32_t code, const Parcel&amp;amp; data, Parcel* reply, uint32_t flags) {&lt;br /&gt;
&lt;br /&gt;
        switch(code) {&lt;br /&gt;
            case LOAD_BOMB_TRANSACTION:&lt;br /&gt;
            {&lt;br /&gt;
                CHECK_INTERFACE(IMyBinder, data, reply);&lt;br /&gt;
                bool err = const_cast&amp;lt;BnMyBinder*&amp;gt;(this)-&amp;gt;loadBomb(data.readInt32());&lt;br /&gt;
                reply-&amp;gt;writeInt32(err);&lt;br /&gt;
            }&lt;br /&gt;
            return NO_ERROR;&lt;br /&gt;
            break;&lt;br /&gt;
                &lt;br /&gt;
            case CHECK_BOMB_TRANSACTION:                &lt;br /&gt;
            {&lt;br /&gt;
                CHECK_INTERFACE(IMyBinder, data, reply);&lt;br /&gt;
                int restBomb = const_cast&amp;lt;BnMyBinder*&amp;gt;(this)-&amp;gt;checkBomb();&lt;br /&gt;
                reply-&amp;gt;writeInt32(restBomb);&lt;br /&gt;
            }&lt;br /&gt;
            return NO_ERROR;&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
            case FIRE_TRANSACTION:&lt;br /&gt;
            {&lt;br /&gt;
                CHECK_INTERFACE(IMyBinder, data, reply);&lt;br /&gt;
                bool err = const_cast&amp;lt;BnMyBinder*&amp;gt;(this)-&amp;gt;fire();&lt;br /&gt;
                reply-&amp;gt;writeInt32(err);&lt;br /&gt;
            }&lt;br /&gt;
            return NO_ERROR;&lt;br /&gt;
            break;  &lt;br /&gt;
&lt;br /&gt;
            default:&lt;br /&gt;
                return BBinder::onTransact(code, data, reply, flags);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 3、实现BpMyBinder ===&lt;br /&gt;
&lt;br /&gt;
如上面所说，BpMyBinder是“代理”，那它是什么代表的是什么呢？&lt;br /&gt;
&lt;br /&gt;
——其实所代理就是IPC服务的提供者，使得在android的所有进程中均能通过这些代理调用其他进程的服务/函数，就像调用本地的服务/函数一样。&lt;br /&gt;
&lt;br /&gt;
为了提供这些服务，BpMyBinder必然要定义使用这些服务的函数（或者说方法），另外，由于BpMyBinder也是继承自IMyBinder，所以就能保证这些函数名和BnMyBinder（同样继承自IMyBinder）中保持一致，方便设计者的使用和查看。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//BpMyBinder.h&lt;br /&gt;
&lt;br /&gt;
#ifndef BP_MY_BINDER_H&lt;br /&gt;
#define BP_MY_BINDER_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;IMyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
    class BpMyBinder : public BpInterface&amp;lt;IMyBinder&amp;gt; {&lt;br /&gt;
        public:&lt;br /&gt;
            BpMyBinder(const sp&amp;lt;IBinder&amp;gt;&amp;amp; impl) //indispensable&lt;br /&gt;
                : BpInterface&amp;lt;IMyBinder&amp;gt;(impl) {&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            virtual bool loadBomb(const int num);&lt;br /&gt;
            virtual int checkBomb(void);&lt;br /&gt;
            virtual bool fire(void);       &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
#endif /* BP_MY_BINDER_H */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//BpMyBinder.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;binder/Parcel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;BpMyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
    bool BpMyBinder::loadBomb(const int num) {&lt;br /&gt;
        Parcel data, reply;&lt;br /&gt;
        data.writeInterfaceToken(IMyBinder::getInterfaceDescriptor());&lt;br /&gt;
        data.writeInt32(num);&lt;br /&gt;
        remote()-&amp;gt;transact(LOAD_BOMB_TRANSACTION, data, &amp;amp;reply);&lt;br /&gt;
        return reply.readInt32();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int BpMyBinder::checkBomb(void) {&lt;br /&gt;
        Parcel data, reply;&lt;br /&gt;
        data.writeInterfaceToken(IMyBinder::getInterfaceDescriptor());&lt;br /&gt;
        remote()-&amp;gt;transact(CHECK_BOMB_TRANSACTION, data, &amp;amp;reply);&lt;br /&gt;
        return reply.readInt32();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool BpMyBinder::fire(void) {&lt;br /&gt;
        Parcel data, reply;&lt;br /&gt;
        data.writeInterfaceToken(IMyBinder::getInterfaceDescriptor());&lt;br /&gt;
        remote()-&amp;gt;transact(FIRE_TRANSACTION, data, &amp;amp;reply);&lt;br /&gt;
        return reply.readInt32();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 4、实现MyBinder ===&lt;br /&gt;
&lt;br /&gt;
MyBinder继承自BnMyBinder，这里主要是在native实现IMyBinder中所定义的纯虚函数，从而使得 BnMyBinder.onTransact的功能分发得以实现。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//MyBinder.h&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;BnMyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
    class MyBinder : public BnMyBinder {            &lt;br /&gt;
        public:&lt;br /&gt;
            virtual bool loadBomb(const int num);&lt;br /&gt;
            virtual int checkBomb(void);&lt;br /&gt;
            virtual bool fire(void);            &lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//MyBinder.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;grp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;binder/IPCThreadState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/ProcessState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/IServiceManager.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Log.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/RefBase.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;MyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace android;&lt;br /&gt;
&lt;br /&gt;
//namespace android {&lt;br /&gt;
&lt;br /&gt;
static int restBomb = 0;&lt;br /&gt;
&lt;br /&gt;
bool MyBinder::loadBomb(const int num) {&lt;br /&gt;
    restBomb+=num;&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int MyBinder::checkBomb(void) {&lt;br /&gt;
    return restBomb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool MyBinder::fire(void) {&lt;br /&gt;
    if(0 &amp;lt; restBomb) {&lt;br /&gt;
        restBomb--;&lt;br /&gt;
        return true;&lt;br /&gt;
    } else {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5、Makefile ===&lt;br /&gt;
&lt;br /&gt;
由于上面这些文件要同时被Server和Client进程引用，同时也不能直接运行，所以应该编译成库，方便其他可执行程序的引用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//Android.mk&lt;br /&gt;
&lt;br /&gt;
LOCAL_PATH:= $(call my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
&lt;br /&gt;
LOCAL_SRC_FILES:= IMyBinder.cpp BnMyBinder.cpp BpMyBinder.cpp MyBinder.cpp&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE:= libMyBinder&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)&lt;br /&gt;
&lt;br /&gt;
LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder&lt;br /&gt;
&lt;br /&gt;
#LOCAL_SHARED_LIBRARIES := libutils&lt;br /&gt;
&lt;br /&gt;
include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 四、验证==&lt;br /&gt;
&lt;br /&gt;
上面的工作是完成了MyBinder这个service的运行模型，但到目前为此是不能运行的，原因是这些仅仅是一些“类”，还未实例化！因此，为了对其进行验证，我们必须创建其实例。&lt;br /&gt;
&lt;br /&gt;
由于是IPC服务，自然我们要创建服务器和客户端，并使其运行在不同的进程中。&lt;br /&gt;
&lt;br /&gt;
=== 1、创建server ===&lt;br /&gt;
&lt;br /&gt;
这里主要是为MyBinder这个service创建一个实例，并加入线程池中（实际是让其线程进行监听）：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//MyServer.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;grp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;binder/IPCThreadState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/ProcessState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/IServiceManager.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Log.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/RefBase.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;MyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace android;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    sp&amp;lt;ProcessState&amp;gt; proc(ProcessState::self());&lt;br /&gt;
&lt;br /&gt;
    sp&amp;lt;IServiceManager&amp;gt; sm = defaultServiceManager();&lt;br /&gt;
&lt;br /&gt;
    sm-&amp;gt;addService(String16(&amp;quot;service.MyBinder&amp;quot;), new MyBinder());&lt;br /&gt;
&lt;br /&gt;
    //MyBinder::instantiate();&lt;br /&gt;
&lt;br /&gt;
    ProcessState::self()-&amp;gt;startThreadPool();&lt;br /&gt;
&lt;br /&gt;
    IPCThreadState::self()-&amp;gt;joinThreadPool();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mk文件，让其编译成可执行文件；另外，由于要新建MyBinder，所以要包含MyBinder中的头文件和MyBinder库文件：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#Android.mk&lt;br /&gt;
&lt;br /&gt;
LOCAL_PATH:= $(call my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
&lt;br /&gt;
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/../MyBinder/&lt;br /&gt;
&lt;br /&gt;
LOCAL_SRC_FILES:= MyServer.cpp&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE:= MyServer&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)&lt;br /&gt;
&lt;br /&gt;
LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder libMyBinder&lt;br /&gt;
&lt;br /&gt;
#LOCAL_SHARED_LIBRARIES := libutils&lt;br /&gt;
&lt;br /&gt;
include $(BUILD_EXECUTABLE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2、创建client ===&lt;br /&gt;
&lt;br /&gt;
在client进程中，根据用户输入的口令，获取&amp;quot;MyBinder&amp;quot;服务，然跨进程“调用”函数，完成“装弹”、“开炮”等任务。&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//MyClient.cpp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LOG_TAG &amp;quot;MyClient&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;grp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;binder/IPCThreadState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/ProcessState.h&amp;gt;&lt;br /&gt;
#include &amp;lt;binder/IServiceManager.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/Log.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utils/RefBase.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;../MyBinder/IMyBinder.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ALOGD printf&lt;br /&gt;
#define ALOGW printf&lt;br /&gt;
#define ALOGE printf&lt;br /&gt;
&lt;br /&gt;
using namespace android;&lt;br /&gt;
&lt;br /&gt;
static void help() {&lt;br /&gt;
	printf(&amp;quot;USAGE:\n\tMyClient fire\n\tMyClient loadBomb &amp;lt;bomb number&amp;gt;\n\tMyClient checkBomb\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
&lt;br /&gt;
    //ALOGD(&amp;quot;argv[0]=%s, argv[1] = %s, argv[2] = %s\n&amp;quot;, *argv, *(argv+1), *(argv+2));&lt;br /&gt;
	if(argc &amp;lt; 2) {&lt;br /&gt;
		help();&lt;br /&gt;
		exit(0);&lt;br /&gt;
	}&lt;br /&gt;
    char *cmd = *(argv+1);&lt;br /&gt;
    char *arg = *(argv+2);&lt;br /&gt;
&lt;br /&gt;
    sp&amp;lt;IBinder&amp;gt; binder =&lt;br /&gt;
        defaultServiceManager()-&amp;gt;getService(String16(&amp;quot;service.MyBinder&amp;quot;));&lt;br /&gt;
    sp&amp;lt;IMyBinder&amp;gt; service = interface_cast&amp;lt;IMyBinder&amp;gt;(binder);&lt;br /&gt;
    if (service.get() == NULL) {&lt;br /&gt;
        ALOGW(&amp;quot;Cannot connect to the service.MyBinder&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    //ALOGD(&amp;quot;get service.MyBinder sucess.\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if(!strcmp(cmd, &amp;quot;fire&amp;quot;)) {&lt;br /&gt;
        if(true == service-&amp;gt;fire()) {&lt;br /&gt;
            ALOGD(&amp;quot;Bang!\n&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            ALOGW(&amp;quot;no bomb..\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    } else if(!strcmp(cmd, &amp;quot;loadBomb&amp;quot;)) {&lt;br /&gt;
        if(NULL != arg) {&lt;br /&gt;
            if(true == service-&amp;gt;loadBomb((char)*arg-48)) {&lt;br /&gt;
                ALOGD(&amp;quot;loadBomb sucess.\n&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                ALOGE(&amp;quot;loadBomb error.\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
			ALOGE(&amp;quot;bomb number should be given.\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
    } else if(!strcmp(cmd, &amp;quot;checkBomb&amp;quot;)) {&lt;br /&gt;
        ALOGD(&amp;quot;rest bomb:%d\n&amp;quot;, service-&amp;gt;checkBomb());&lt;br /&gt;
    } else {&lt;br /&gt;
		help();&lt;br /&gt;
	}&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mk文件：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#Android.mk&lt;br /&gt;
&lt;br /&gt;
LOCAL_PATH:= $(call my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
&lt;br /&gt;
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/../MyBinder/&lt;br /&gt;
&lt;br /&gt;
LOCAL_SRC_FILES:= MyClient.cpp&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_TAGS := optional&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE:= MyClient&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)&lt;br /&gt;
&lt;br /&gt;
LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder libMyBinder&lt;br /&gt;
&lt;br /&gt;
#LOCAL_SHARED_LIBRARIES := libutils&lt;br /&gt;
&lt;br /&gt;
include $(BUILD_EXECUTABLE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3、验证结果 ===&lt;br /&gt;
&lt;br /&gt;
将上面的文件编译，将分别得到一个库文件和二个可执行文件，即这些文件push到手机中就可以开始验证了。&lt;br /&gt;
&lt;br /&gt;
（1）在火炮未准备就绪的情况下（即server未运行），“开炮”&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient fire&lt;br /&gt;
结果（均为通过 adb logcat -v time | egrep &amp;quot;MyClient|MyBinder&amp;quot; 命令查看）：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
01-02 11:44:50.558 W/ADB_SERVICES( 4504): create_local_service_socket() name=shell:MyClient fire&lt;br /&gt;
01-02 11:44:50.577 I/ServiceManager( 4529): Waiting for service service.MyBinder...&lt;br /&gt;
01-02 11:44:51.578 I/ServiceManager( 4529): Waiting for service service.MyBinder...&lt;br /&gt;
01-02 11:44:52.578 I/ServiceManager( 4529): Waiting for service service.MyBinder...&lt;br /&gt;
01-02 11:44:53.579 I/ServiceManager( 4529): Waiting for service service.MyBinder...&lt;br /&gt;
01-02 11:44:54.579 I/ServiceManager( 4529): Waiting for service service.MyBinder...&lt;br /&gt;
01-02 11:44:55.579 W/MyClient( 4529): Cannot connect to the service.MyBinder&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
（2）&lt;br /&gt;
&lt;br /&gt;
准备火炮：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyServer&lt;br /&gt;
再开炮：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient fire&lt;br /&gt;
结果：&lt;br /&gt;
 01-02 11:45:03.247 W/MyClient( 4534): no bomb..&lt;br /&gt;
没炮弹了？查看一下：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient checkBomb&lt;br /&gt;
结果：&lt;br /&gt;
 01-02 11:45:21.359 D/MyClient( 4536): rest bomb:0&lt;br /&gt;
还真是！装弹：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient loadBomb 2&lt;br /&gt;
结果显示装弹成功：&lt;br /&gt;
 01-02 11:45:29.909 D/MyClient( 4538): loadBomb sucess.&lt;br /&gt;
保险起见，再检查一下：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient checkBomb&lt;br /&gt;
返回所剩炮弹：&lt;br /&gt;
 01-02 11:45:33.128 D/MyClient( 4540): rest bomb:2&lt;br /&gt;
好吧，可以开炮了吧：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient fire&lt;br /&gt;
结果：&lt;br /&gt;
 01-02 11:45:41.779 D/MyClient( 4542): Bang!&lt;br /&gt;
再来：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient fire&lt;br /&gt;
结果：&lt;br /&gt;
 01-02 11:45:45.202 D/MyClient( 4544): Bang!&lt;br /&gt;
兴起！再来！：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient fire&lt;br /&gt;
额，又没炮弹了？：&lt;br /&gt;
 01-02 11:45:54.152 W/MyClient( 4546): no bomb..&lt;br /&gt;
对，好像刚是只装了两发：&lt;br /&gt;
 C:\DaS\tel123&amp;gt; adb shell MyClient checkBomb&lt;br /&gt;
结果：&lt;br /&gt;
 01-02 11:45:56.566 D/MyClient( 4548): rest bomb:0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上述源码可从[http://www.hovercool.com/upload/en/code/MyBinder.rar 这里]打包下载.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
参考资料：&lt;br /&gt;
&lt;br /&gt;
http://disanji.net/2011/02/28/android-bnder-design/&lt;br /&gt;
&lt;br /&gt;
http://blog.csdn.net/a345017062/article/details/6175519&lt;br /&gt;
&lt;br /&gt;
http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>