- 浏览: 929223 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
1. 我们先来看一个与本地service通信的例子。
local servcie 的代码如上,在onBinder方法中返回binder,binder包含了service的句柄,客户端得到句柄以后就可以调用servcie的公共方法了,这种调用方式是最常见的。
需要注意的是在onStop中要解绑定service, 否则会造成内存泄露的问题。
2. 我们再看一下与另外一个进程中的service进行通信的问题(跨进程通信!)。
如何将servcie运行在另外一个进程呢?在manifest 里面配置个属性就行了。
android:process=":remote" , 代表这个service运行在同一个应用程序的不同进程中。
获得service端传来的binder,用来构建一个Messenger向service发送消息。
构建一个Messenger,包含一个handler,然后将messenger的binder传给客户端,客户端可以通过handler再构造一个messenger与service通信,消息在handler里面被处理。
现在是service端单向响应客户端的消息,同理可以做成双向发送消息,实现双向通信。
public class LocalService extends Service { @Override public IBinder onBind(Intent intent) { return new LocalBinder(); } public void sayHelloWorld(){ Toast.makeText(this.getApplicationContext(), "Hello World Local Service!", Toast.LENGTH_SHORT).show(); } public class LocalBinder extends Binder { LocalService getService() { // Return this instance of LocalService so clients can call public methods return LocalService.this; } } }
local servcie 的代码如上,在onBinder方法中返回binder,binder包含了service的句柄,客户端得到句柄以后就可以调用servcie的公共方法了,这种调用方式是最常见的。
public class LocalServiceTestActivity extends Activity { static final String TAG = "LocalBinderTestActivity"; ServiceConnection mSc; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSc = new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "service connected"); LocalService ss = ((LocalBinder)service).getService(); ss.sayHelloWorld(); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "service disconnected"); } }; } @Override protected void onStart() { super.onStart(); Log.d(TAG, this.getApplicationContext().getPackageCodePath()); Intent service = new Intent(this.getApplicationContext(),LocalService.class); this.bindService(service, mSc, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); //must unbind the service otherwise the ServiceConnection will be leaked. <span style="color: rgb(255, 0, 0); ">this.unbindService(mSc);</span> } }
需要注意的是在onStop中要解绑定service, 否则会造成内存泄露的问题。
2. 我们再看一下与另外一个进程中的service进行通信的问题(跨进程通信!)。
如何将servcie运行在另外一个进程呢?在manifest 里面配置个属性就行了。
android:process=":remote" , 代表这个service运行在同一个应用程序的不同进程中。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ckt.wangxin" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".LocalServiceTestActivity" android:label="@string/app_name" > <!-- <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> --> </activity> <service android:name=".LocalService"></service> <!-- android:process=":remote" specify this service run in another process in the same application. --> <service android:name=".RemoteService" android:process=":remote"></service> <activity android:name="RemoteServiceTestActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
public class RemoteServiceTestActivity extends Activity { static final String TAG = "RemoteServiceTestActivity"; ServiceConnection mSc; public static final int SAY_HELLO_TO_CLIENT = 0; /** * Handler of incoming messages from service. */ class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case SAY_HELLO_TO_CLIENT: Toast.makeText(RemoteServiceTestActivity.this.getApplicationContext(), "Hello World Remote Client!", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } } } Messenger messenger_reciever = new Messenger(new IncomingHandler()); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSc = new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "service connected"); <span style="color: rgb(204, 0, 0); ">Messenger messenger = new Messenger(service); Message msg = new Message(); msg.what = RemoteService.MSG_SAY_HELLO;</span> msg.replyTo = messenger_reciever; try { <span style="color: rgb(255, 0, 0); ">messenger.send(msg);</span> } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "service disconnected"); } }; } @Override protected void onStart() { super.onStart(); Log.d(TAG, this.getApplicationContext().getPackageCodePath()); Intent service = new Intent(this.getApplicationContext(),RemoteService.class); this.bindService(service, mSc, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); //must unbind the service otherwise the ServiceConnection will be leaked. this.unbindService(mSc); } }
获得service端传来的binder,用来构建一个Messenger向service发送消息。
public class RemoteService extends Service { public static final int MSG_SAY_HELLO = 0; @Override public IBinder onBind(Intent intent) { <span style="color: rgb(204, 0, 0); "> return messager.getBinder();</span> } Handler IncomingHandler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.replyTo != null){ Message msg_client = this.obtainMessage(); msg.what = RemoteServiceTestActivity.SAY_HELLO_TO_CLIENT; try { ((Messenger)msg.replyTo).send(msg_client); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } switch (msg.what) { case MSG_SAY_HELLO: Toast.makeText(RemoteService.this.getApplicationContext(), "Hello World Remote Service!", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } } }; Messenger messager = new Messenger (IncomingHandler); }
构建一个Messenger,包含一个handler,然后将messenger的binder传给客户端,客户端可以通过handler再构造一个messenger与service通信,消息在handler里面被处理。
现在是service端单向响应客户端的消息,同理可以做成双向发送消息,实现双向通信。
发表评论
-
android-Service和Thread的区别
2013-08-23 09:17 914servie是系统的组件,它由系统进程托管(servicema ... -
git介绍
2013-08-01 14:49 1035git介绍 使用Git的第一件事就是设置你的名字和email ... -
cocos2d-x学习之自动内存管理和常见宏
2013-07-29 15:41 9081.自动内存管理 1)概述 C++语言默认是 ... -
cocos2dx中利用xcode 调用java中的函数
2013-07-29 11:36 25251. 先把cocos2dx根目录中的 /Users/zhaos ... -
cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解
2013-07-29 10:35 1109第一个改动: CCLayer初始化 自定义Layer,类名 ... -
xcode与eclipse整合cocos2dx
2013-07-29 10:32 1220文档xcode版本是 204 1. 在xcode中创建coc ... -
git提交代码
2013-07-23 16:00 10531. 在本地创建一个Git的工作空间,在里面创建一个工程(如H ... -
Android.mk的用法和基础
2013-07-19 14:11 4332一个Android.mk file用来向编译系统描述你的源代码 ... -
eclipse配置NDK-Builder命令
2013-07-18 11:02 10351. 2. -
eclipse配置javah命令
2013-07-18 10:48 19931.找到javah命令所在的目录 我的为 /usr/bi ... -
Android SDL2.0 编译
2013-07-17 13:40 19671,下载: wget http://www.libsdl.o ... -
IntelliJ Idea 常用快捷键列表
2013-05-27 10:19 0Alt+回车 导入包,自动修 ... -
android应用后台安装
2013-05-21 12:02 1015android应用后台安装,静默安装的代码实现方法 http ... -
编译linux内核映像
2013-05-21 11:33 962a)准备交叉编译工具链 android代码树中有一个pr ... -
如何单独编译Android源代码中的模块
2013-05-21 11:29 994一. 首先在Android源代码 ... -
Ubuntu安装JDK6和JDK5
2013-05-19 19:04 1006sudo apt-get install sun-java6- ... -
java_jni详解_01
2013-05-08 17:15 956java中的jni 例子HelloWorld 准备过程: 1 ... -
下载android源码 中断解决原因
2013-05-07 15:51 1315解决方法 1. 浏览器登录https://android.go ... -
mac下编译ffmpeg1.1.4
2013-05-07 14:55 1364经过一番网上搜索 与 无数次的编译 终于成功了 下面献上编译 ... -
图片透明化处理
2013-01-12 11:27 1274MIDP2.0的图片编程中,可以把图片理解为一个int[]数组 ...
相关推荐
### Android系统的Binder机制之一——Service_Manager #### 一、引言 在深入探讨Android系统中的Binder机制之前,我们首先简要回顾一下Binder机制的基本概念及其重要性。Android系统基于Linux内核,但在进程间通信...
MediaService在启动时会在Service Manager中注册自己,这样其他需要使用多媒体功能的进程就可以通过Binder机制与MediaService通信,请求媒体播放、控制等相关操作。 #### 实现自己的核心服务 如果想要实现自己的...
在Linux系统中,虽然有多种IPC方式(如管道、套接字、消息队列等),但 Binder 为Android提供了高效且特定于平台的解决方案。 首先,让我们详细了解一下Android Binder的工作原理。Binder基于C/S架构,由Client、...
在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的主要机制,它是一种轻量级的通信方式,允许不同进程间的对象互相调用方法,从而实现数据交换和功能调用。本示例"Android利用Binder...
Binder是Android操作系统中的一个核心组件,它为Android应用程序提供了安全、高效的进程间通信方式。与其他IPC机制相比,Binder具有更低的开销,支持对象的远程调用,并且具备良好的安全性。Binder机制由服务端、...
- **权限控制**:Binder机制支持权限检查,只有拥有特定权限的Client才能访问特定的Service。 6. **Binder性能优化** - **缓存策略**:通过缓存最近使用的Binder对象,减少不必要的创建和销毁,提高效率。 - **...
Binder的设计理念和实现方式对于理解Android底层机制具有重要意义。然而,由于Binder涉及到复杂的多线程和内核交互,因此在实际开发中还需要注意相关的安全性和稳定性问题。 综上所述,Android的Binder机制是一项...
Binder是Android系统中一种轻量级的进程间通信方式,它允许不同进程之间的对象调用对方的方法,就像是在同一进程中一样。Binder基于C/S架构,客户端和服务端通过Binder接口进行通信,实现了数据和方法的传递。 接...
"Android Binder C/C++层实现示例"提供了一个实践性的学习资源,帮助开发者深入理解Binder机制的底层实现,包括Client和Server的交互、Parcel数据封装、Service Manager的使用等核心概念,从而提升对Android系统内核...
使用BinderService的好处在于,它提供了一种标准的方式来注册和管理Native服务,使得服务的生命周期管理更加规范和统一,同时也简化了服务的发布流程。开发者只需要关注服务的具体实现,而无需关心底层的IPC细节。 ...
此外,Binder支持实名和匿名连接,对于需要保护隐私或防止非法访问的服务,可以选择使用匿名Binder。 **5. Binder的线程管理与内存映射** 在接收端,Binder使用线程池来处理来自不同Client的请求,避免了因频繁...
通过Binder,Android系统服务如ActivityManagerService、ContentProvider等能跨进程调用,提供了强大的功能扩展性。 Handler与MessageQueue结合,是Android中实现线程间通信的关键。Handler通常在主线程中创建,...
总结,使用Android的Binder机制进行RPC是一种高效且安全的跨进程通信方式,结合C语言接口编程可以充分利用C/C++的性能优势,尤其适用于对性能有较高要求的场景。理解并熟练掌握Binder机制及其与RPC的结合,对于开发...
Camera Architecture 中使用了 Binder 机制来实现 Camera Framework 和 Camera Client 之间的通信。 Camera Framework 是 Android 操作系统中负责处理 CAMERA 相关功能的框架,它提供了一个接口供应用程序访问 ...
Binder机制是Android平台实现跨进程通信(Inter-Process Communication,IPC)的关键技术,它不仅为系统提供了高效稳定的通信框架,而且是众多系统服务如MediaService、ActivityManagerService等得以正常运作的基础...
### Android Binder设计与实现 #### 一、引言与背景 随着智能手机的普及与功能的多样化,...对于Android开发者来说,理解Binder的工作原理和使用方法至关重要,可以帮助他们构建出更稳定、更高效的应用程序和服务。
### Android Binder机制...通过上述过程,我们可以看到Binder机制是如何支持Android系统中Service Manager以及各个服务之间的通信的。它不仅提供了灵活的服务注册和查询机制,还确保了跨进程间通信的安全性和高效性。
Android系统的一些核心组件,如ContentProvider、Service等,可能使用到Binder连接池。比如,当多个应用同时访问同一个ContentProvider时,通过Binder连接池可以避免重复创建和销毁Binder,从而提升系统性能。 6. *...
然后,将这个`MyBinder`对象绑定到Service中,这样当客户端连接时,就可以通过这个Binder访问服务端的方法。 ```java public class MyService extends Service { private MyBinder myBinder = new MyBinder(); ...