- 浏览: 512951 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
Binder理解
例子代码:
/** {@hide} */
public abstract class ActivityManagerNative extends Binder implements IActivityManager
{
/**
* Cast a Binder object into an activity manager interface, generating
* a proxy if needed.
*/
static public IActivityManager asInterface(IBinder obj)
{
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
/**
* Retrieve the system's default/global activity manager.
*/
static public IActivityManager getDefault()
{
if (gDefault != null) {
//if (Config.LOGV) Log.v(
// "ActivityManager", "returning cur default = " + gDefault);
return gDefault;
}
IBinder b = ServiceManager.getService("activity");
if (Config.LOGV) Log.v(
"ActivityManager", "default service binder = " + b);
gDefault = asInterface(b);
if (Config.LOGV) Log.v(
"ActivityManager", "default service = " + gDefault);
return gDefault;
}
如上代码:
通过asInterface(b)可以把b转成IActivityManager 实现ActivityManagerService的一个代理
IActivityManager的实现是ActivityManagerService
class ActivityManagerProxy implements IActivityManager作为ActivityManagerService的一个代理。也实现了IActivityManager接口,应该和ActivityMangerService一样,但同时拥有activityManagerService的应用。
public ActivityManagerProxy(IBinder remote)
{
mRemote = remote;
}
public IBinder asBinder()
{
return mRemote;
}
调用这个服务实现mRemote做事
启动activity:
Aactivity启动Bactivity的过程描述
代码如下:
Intent intent =new Intent(Aactivity.this, Bactivity.class);
startActivity(intent);
接下来分析:
1.Acticity.startActivityForResult() @Aactivity
2.Instrumention.execStartActivity(); @ Insrumention
此类是一个监控类,主要用于监控Activity的生命周期 的执行,比如,什么时候调用了onCreate,什么时候调用了onPause()方法等。
3.ActivityManagerNative.getDefault() .startActivity()
3.1 ActivityManagerNative.getDefault()返回的是ActivityManagerProxy的实例,
它只是一个代理类,这个代理类实际上代理的是IBinder b = ServiceManager.getService("activity");
这个Service。
3.2 这个Service是什么时候添加进来的呢?
在SystemServer.java的run()中有调用
ActivityManagerService.setSystemProcess();
ServiceManager.addService("activity", m);
这里还会添加许多系统关键服务。
(TODO:查看在SystemServer的Log输出)
3.3 由于ActivityManagerService是一个系统类,因此访问他要经过一个代理,不能直接访问,而且用代理类访问他,我们可以在访问他以前做一些其它操作,因此ActivityManagerNative.getDefault(),看代码是返回的一个 ActivityManagerProxy类的实例,这个类就是ActivityManagerService的代理类,也就是通过这个类来访问AMS, 代码如下
static public IActivityManager getDefault() {
if(gDefault!=null) {
return gDefault
}
IBinder b=ServiceManager.getService("activity"); // 从ServiceManager进程中获得AMS实例
gDefault=asInterface(b); // 把获得的AMS实例要通过adInterface接口赋给其代理类
return gDefault
}
再看asInterface() 方法,如下
static public IActivityManager asInterface(IBinder obj) {
if(obj==null) {
return null;
}
IActivityManager in=(IActivityManager)obj.queryLocalInterface(descriptor);
if(in!=null) {
return in;
}
return new ActivityManagerproxy(obj); // 这句就是把AMS的实例当作参数传给了ActivityManagerProxy类
// 因此我们想操作AMS就要通过此代理类来操作,不能直接调用
}
因此,ActivityManagerNative.getDefault() .startActivity() 这句代码,实际执行的是
ActivityManagerProxy类中的startActivity() 方法
4:我们再分析ActivityManagerProxy类
ActivityManagerProxy是ActivityManagerNative类的一个内部类,其定义如下:
class ActivityManagerProxy implements IActivityManager {
private IBinder mRemote;
// 构造函数
public ActivityManagerProxy(IBinder remote) {
mRemote=remote; // 此处就是asInterface方法中定义时把AMS实例传过来的,也就是说
// 此处的mRemote就是ActivityManagerService实例
}
}
再分析ActivityManagerProxy中的startActivity方法,定义如下:
public int startActivity(IApplicationThread caller,
Intent intent ,
String resolvedType,
Uri[] grantedUriPermissions,
int grantedMode,
IBinder resultTo,
String resultWho
int requestCode,
boolean onlyIfNeeded,
boolean debug) {
Parcel data=Parcel.obtain(); //把客户端传递的数据封装一下,然后跨进程传递
Parcel reply =Parcel.obtain();
data.writeInterfaceToken(IActivityManage.descriptor); // 保存数据
....
....
mRote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
// 此句代码很重要,它会把以上所有数据,跨进程传递给ActivityManagerService类中onTrasact方法处理。
}
5: 分析ActivityManagerService类
第一个方法是onTrasact() ,来接受客户端传递数据,方法定义如下:
public boolean onTransact(int code , Parcel data , Parcel reply, int flags) {
super.onTransact(code ,data , reply , flags); // 调用父类ActivityManagerNative中的onTrasact()方法
}
onTrasact() 方法主要是接受trasact()方法封装的参数,也就是trasact()函数相当于封包,onTrasact()相当于拆包
把解析出来的参数,传给ActivityManagerService中的 startActivity()
------startActivity() @ActivityManagerService
------startActivityMayWait() @ActivityManagerService
------startActivityLocked() @ActivityManagerService
------startActivityUncheckedLocked() @ActivityManagerService 此方法检查权限,解析Intent中的flag语句
-------startActivityLocked() @ActivityManagerService// 与上个方法参数不一样,
--------resumeTopActivityLocked() @ActivityManagerService
--------startSpecificActivityLocked @ActivityManagerService // 此方法内容会分两部分执行,首先判断activity的进程是否启动,如果已经启动则执行第1种方案,如果没有启动,则启动第2种方案,
方案1:
--------startProcessLocked () @ActivityManagerService
方案2:
--------realStartActivityLocked() @ActivityManagerService // 此方法是进入真正启动一个Activity流程
--------scheduleLaunchActivity () @ActivityThread @ApplicationThread // 此方法进入到
ApplicationThreadNative提供的服务,也就是到ActivityThread的内部类ApplicationThread类中,
这里相当于进入客户端处理了,(到此服务端的Activity实例初始化完毕)。
scheduleLaunchActivity方法定义如下:
scheduleLaunchActivity (Intent intent, IBinder token, int ident......) {
ActivityRecord r = new ActivityRecord() ; // 为此Activity定义一个客户端实例
....
queueOrSendMessage(H.LAUNCH_ACTIVITY, r); // 把启动Activity的消息传给一个内部类(H)来处理
// H类是一个Handler,
}
--------------handleLaunchActivity @ ActivityThread
--------------performLaunchActivity @ActivityThread // 此方法开始具体创建Activity,并调用其生命周期
此方法定义如下 :
private final Activity performLauchActivity(ActivityRecord r, Intent customIntent) {
.....
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
// 通过反射构造出Activity对象
activity.attach();// 调用Activity的attach() 方法, 此方法比较重要,主要创建Activity中的Window及
// WindowManager , 等会儿具体分析
以下会逐渐调用Activity中生命周期的方法
mInstrumentation.callActivityOnCreate(activity, r.state); // 调用Activity中的onCreate方法
activity.performStart() ; // 调用
mInstrumentation.callActivityOnRestoreInstanceState(activity,r.state);
mInstrumentation.callActivityOnPostCreate(activity,r.state);
mActivitys.put(r.token,r); // 压入栈
}
--------------handleResumeActivity: 开始调用onResume() 方法,
--------------performResumeActivity(); // 调用onResume()方法
performResumeActivity () {
....
r.activity.performResume(); // 调用Activity中的onResume方法
.....
}
到此为止,整个Activity已经创建,启动了,但是他还什么都没有显示,因为没有显示在屏幕上,
handleResumeActivity() {
--r.window.getDecorView(); //开始把DecorView添加进Window
--wm.addView(decor, l);
}
屏幕上的内容,会显示出来, 至于窗口是怎么创建出来的,那要分析Activity中的Attach()方法了,以后再分析!
6:Activity与Window,View的关系分析,
在Android系统中,一个界面可以由两部分组成,
一:逻辑控制部分:Activity部分
二:界面显示部分:Window+View 部分,其中主要是View部分
Activity主要是
评论
知道how,但是不知道why?
楼主知道为什么不能直接访问吗,求指教发表评论
-
onInterceptTouchEvent和onTouchEvent调用时序
2012-02-08 08:44 1045onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 914Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1207Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1570【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1147Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1202android 中使用socket使native和frame ... -
android aidl iBinder理解
2011-06-01 11:51 2063在android中有一个程序员大量使用的操作,就是bindse ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1293Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 895近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1072AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 10361. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 858(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2168Android的Launcher成为系统 ... -
Launcher的启动过程
2011-05-12 19:36 22381. Launcher的启动过程 从网络上 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6559android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2883典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1165转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2480android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 35161.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1480在生成的apk目录下放 signapk.jar platfo ...
相关推荐
- 它类似Java接口,但能被编译成Binder理解和使用的二进制格式。 3. **创建服务端接口**: - 在服务端,首先需要定义一个AIDL文件,例如`IMyBinder.aidl`,声明服务提供的方法。 - AIDL文件中的每个方法都会在...
理解Binder的工作原理和设计细节对于提升Android应用的性能和安全性至关重要。 1. Binder通信模型与协议 Binder通信模型基于Client-Server架构,其中Client与Server通过Binder驱动进行交互。通信协议定义了数据交换...
这些注解不仅帮助Model Binder理解如何正确地绑定数据,还能生成客户端验证规则,提供更好的用户体验。 本课程可能涵盖了一些关键概念,如: 1. Model Binder的基本工作流程和机制。 2. 如何利用内置的Model Binder...
这些代码可以帮助我们理解Binder通信的具体实现,例如如何创建 Binder 代理、如何定义服务接口、如何进行数据传递等。 总结来说,“Android Binder简单实例”涉及到Android系统中进程间通信的核心技术——Binder,...
分析这些文件可以帮助我们深入理解移植的具体实现细节,包括代码结构、接口设计以及优化策略。 总的来说,将Android Binder移植到Linux是一项复杂的工作,涉及到操作系统内核和用户空间的多个层面。但成功移植后,...
在Android系统中,Binder是进程间通信(IPC,Inter-Process Communication)的主要机制,它使得应用程序之间能够共享数据和服务。...理解并正确运用Binder连接池,对于提升Android应用的性能和用户体验至关重要。
这种方式需要对Binder协议有深入的理解,因为直接操作设备节点意味着需要手动构建和解析 Binder 消息,这通常比使用Android提供的AIDL(Android Interface Definition Language)接口更复杂。 在压缩包文件名"rpc_...
### Android Binder原理详解 #### 一、概述 Android Binder 是 Android 操作系统中核心的...在未来的学习和开发中,理解 Binder 的工作原理将有助于更好地利用这一强大的工具来构建高效的 Android 应用程序和服务。
通过对Binder驱动程序的深入分析,我们可以更好地理解Android系统底层的通信机制,这对于开发高性能、高可靠的Android应用具有重要意义。未来的研究可以进一步探索Binder机制在不同场景下的优化策略,以提升Android...
3. **简洁性**:Binder的设计较为简单明了,易于理解和实现。 4. **统一性**:Binder机制不仅适用于C/C++环境,还适用于Java环境,使得整个Android平台的IPC机制更加统一和一致。 #### Binder机制的关键组成部分 -...
本文将深入探讨"IPC方式之Binder连接池"这一主题,结合提供的DEMO实例,帮助你更好地理解和应用Binder连接池。 首先,我们要明白Binder是什么。Binder是Android系统中一种轻量级的进程间通信方式,它允许不同进程...
Binder机制是Android系统的核心技术之一,深入理解和掌握Binder机制对于开发高性能的Android应用和服务是至关重要的。开发者可以通过阅读Android源码以及利用官方文档和社区资源来进一步了解和学习Binder机制的具体...
本篇将通过一个学习实例来深入理解Android Binder的工作原理及其应用。 一、Binder概述 Binder是Android操作系统中的一个核心组件,它为Android应用程序提供了安全、高效的进程间通信方式。与其他IPC机制相比,...
通过`binder_test`这个示例,你可以深入理解Android系统的Binder机制,学习如何使用C++进行Binder编程,这对于开发涉及多进程通信的Android应用非常有帮助。实践中不断探索,将使你更加熟练掌握这一核心技术。
深入理解Binder机制对于Android应用开发尤其是系统级服务开发至关重要。 一、Binder基础概念 Binder是Android特有的一个轻量级的进程间通信机制,它允许不同进程间的对象互相调用方法,仿佛它们处于同一进程中。...
【Binder详解:C++实现与服务通知】 ...在C++中实现Binder涉及到对Android Native API的理解和使用,以及对服务通知机制的掌握。通过分析和学习"Binder例子"这个项目,可以更好地掌握Binder在实际开发中的应用。
首先,理解Binder机制的基本概念至关重要。Binder是Android操作系统提供的一种接口,通过它,应用程序可以跨进程调用服务,就像它们在同一进程中一样。Binder通信涉及到三个主要角色:客户端、服务端和Binder驱动。...
本示例"Android利用Binder进行通信DEMO"提供了一个简单的Binder通信流程,尽管代码质量可能不高,但基本思路清晰,有助于理解Binder的核心概念。 1. **Binder基础**:Binder是Android系统中的特殊对象,它可以跨...