当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪Android - Binder机制 - client和普通service交互      以下几篇文章是较深入分析binder机制。 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 3. Android - Binder机制 - 获得普通service 4. Android - Binder机制 - clie.........
    ▪Spring攻略学习笔记(3.05)------重用切入点定义      一、知识点        在编写AspectJ aspect时,可以直接在通知注解中嵌入切入点表达式。但是,相同的切入点表达式可能在多个通知中重复。        和.........
    ▪Spring攻略学习笔记(3.04)------指定Aspect优先级      一、知识点         当相同连接点上应用了多个aspect时,aspect的优先级是不明确的,除非显式地指定它们的优先级。        aspect的优先级可以通.........

[1]Android - Binder机制 - client和普通service交互
    来源: 互联网  发布时间: 2013-11-19

以下几篇文章是较深入分析binder机制。

目录

1. Android - Binder机制 - ServiceManager

2. Android - Binder机制 - 普通service注册

3. Android - Binder机制 - 获得普通service

4. Android - Binder机制 - client和普通service交互

5. Android - Binder机制 - Binder框架总结

6. Android - Binder机制 - ProcessState和IPCThreadState

7. Android - Binder机制 - 驱动

Android - Binder机制 - client和普通service交互
UML及说明



和前两篇结构基本一致,只说明特别的几个地方:

1. Camera客户端执行startPreview()是通过BpCamera来完成的;

2. ICamera定义了摄像头操作的接口,它是抽象类,BpCamera是客户端的实现;

3. CameraService: :Client是服务端,每个Camera客户端对应一个CameraService: :Client;

4. BnCamera服务端对ICamera的实现;

5. BBinder在之前没见过,它服务端对IBinder的实现,主要接口是onTransact();

6. 这个图BpBinder和BBinder应该各对应一组ProcessState和IPCThreadState,因为它们存在于每个binder进程,不管是客户端还是服务端;


交互流程

1. Camera的startPreview()调用BpCamera的startPreview();
2. BpCamera执行remote()->transact(START_PREVIEW, data, &reply),而remote()就是BpBinder;
3. BpBinder里的mHandle是CameraService::Client的handle索引;
4. Camera进程的IPCThreadState的transact转发请求;
5. 服务端的IPCThreadState通过talkWithDriver接收到上面的请求,当然这其中mHandle起到了很重要的作用;
6. BBinder的transact和onTransact和BnCamera的onTransact依次执行;
7. BnCamera的onTransact中调用了startPreview()函数,而这个函数就是CameraService::Client的startPreview();
8. 返回值按照相反的路径返回;



作者:Gykimo 发表于2013-5-8 17:39:22 原文链接
阅读:37 评论:0 查看评论

    
[2]Spring攻略学习笔记(3.05)------重用切入点定义
    来源: 互联网  发布时间: 2013-11-19

一、知识点

       在编写AspectJ aspect时,可以直接在通知注解中嵌入切入点表达式。但是,相同的切入点表达式可能在多个通知中重复。

       和其它许多AOP实现一样,AspectJ也允许独立地定义切入点,在多个通知中重用。

二、代码示例

       在AspectJ aspect中,切入点可以声明为一个带有@Pointcut注解的简单方法。切入点的方法体通常为空,因为将切入点定义与应用程序逻辑混合在一起是不合理的。切入点方法的访问修饰符控制切入点的可见性。其他通知可以用方法名称引用这个切入点。

package com.codeproject.jackie.springrecipesnote.springaop;

import java.util.Arrays;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorLoggingAspect {
	private Log log = LogFactory.getLog(this.getClass());

	@Pointcut("execution(* *.*(..))")
	private void loggingOperation() {
	}

	@Before("loggingOperation()")
	public void logBefore(JoinPoint joinPoint) {
		log.info("The method " + joinPoint.getSignature().getName()
				+ "() begins with " + Arrays.toString(joinPoint.getArgs()));
	}

	@After("loggingOperation()")
	public void logAfter(JoinPoint joinPoint) {
		log.info("The method " + joinPoint.getSignature().getName() + "() ends");
	}

	@AfterReturning(pointcut = "loggingOperation())", returning = "result")
	public void logAfterReturning(JoinPoint joinPoint, Object result) {
		log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result);
	}

	@AfterThrowing(pointcut = "loggingOperation())", throwing = "e")
	public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
		log.error("An exception " + e + " has been thrown in " + joinPoint.getSignature().getName() + "()");
	}

	@Around("loggingOperation()")
	public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
		log.info("The method " + joinPoint.getSignature().getName() + "() begins with " + Arrays.toString(joinPoint.getArgs()));
		try {
			Object result = joinPoint.proceed();
			log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result);
			return result;
		} catch (IllegalArgumentException e) {
			log.error("Illegal argument " + Arrays.toString(joinPoint.getArgs()) + " in " + joinPoint.getSignature().getName() + "()");
			throw e;
		}
	}
}

通常,如果切入点在多个aspect之间共享,最好将它们集中到一个公共类中。在这种情况下,它们必须声明为public。

package com.codeproject.jackie.springrecipesnote.springaop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorPointcuts {
	@Pointcut("execution(* *.*(..))")
	public void loggingOperation() {
	}
}

当引用这个切入点时,必须包含类名。如果类不在与这个aspect相同的包中,还必须包含包名。

        @Before("CalculatorPointcuts.loggingOperation()")
	public void logBefore(JoinPoint joinPoint) {
		log.info("The method " + joinPoint.getSignature().getName()
				+ "() begins with " + Arrays.toString(joinPoint.getArgs()));
	}

	@After("CalculatorPointcuts.loggingOperation()")
	public void logAfter(JoinPoint joinPoint) {
		log.info("The method " + joinPoint.getSignature().getName() + "() ends");
	}

	@AfterReturning(pointcut = "CalculatorPointcuts.loggingOperation())", returning = "result")
	public void logAfterReturning(JoinPoint joinPoint, Object result) {
		log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result);
	}

	@AfterThrowing(pointcut = "CalculatorPointcuts.loggingOperation())", throwing = "e")
	public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
		log.error("An exception " + e + " has been thrown in " + joinPoint.getSignature().getName() + "()");
	}

	@Around("CalculatorPointcuts.loggingOperation()")
	public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
		log.info("The method " + joinPoint.getSignature().getName() + "() begins with " + Arrays.toString(joinPoint.getArgs()));
		try {
			Object result = joinPoint.proceed();
			log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result);
			return result;
		} catch (IllegalArgumentException e) {
			log.error("Illegal argument " + Arrays.toString(joinPoint.getArgs()) + " in " + joinPoint.getSignature().getName() + "()");
			throw e;
		}
	}






作者:jackiehff 发表于2013-5-8 17:27:41 原文链接
阅读:32 评论:0 查看评论

    
[3]Spring攻略学习笔记(3.04)------指定Aspect优先级
    来源: 互联网  发布时间: 2013-11-19
一、知识点 

       当相同连接点上应用了多个aspect时,aspect的优先级是不明确的,除非显式地指定它们的优先级。

       aspect的优先级可以通过实现Ordered接口或者使用@Order注解实现。

二、代码示例

      (1)实现Ordered接口    

package com.codeproject.jackie.springrecipesnote.springaop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.Ordered;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorValidationAspect implements Ordered{
	private Log log = LogFactory.getLog(this.getClass());
	
	@Before("execution(* *.*(double, double))")
	public void validateBefore(JoinPoint joinPoint) {
		for (Object arg : joinPoint.getArgs()) {
			log.info("validate begins...");
			validate((Double) arg);
		}
	}

	private void validate(Double arg) {
		if (arg < 0) {
			throw new IllegalArgumentException("Positive numbers only");
		}
	}

	@Override
	public int getOrder() {
		return 0;
	}
}  

  

package com.codeproject.jackie.springrecipesnote.springaop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.Ordered;

/**
 * @author jackie
 * 
 */
@Aspect
public class CalculatorLoggingAspect implements Ordered{
	private Log log = LogFactory.getLog(this.getClass());

	/**
	 * 切入点表达式匹配ArithmeticCalculator接口的add()方法的执行。
	 * 表达式前导的星号匹配任何修饰符(public、protected和private)和任何返回类型。
	 * 参数列表中的两个点匹配任何数量的参数。
	 */
	@Before("execution(* ArithmeticCalculator.add(..))")
	public void logBefore() {
		log.info("The method add() begins");
	}

	@Override
	public int getOrder() {
		return 1;
	}
}

     只要在Bean配置文件中声明这个aspect的一个Bean实例,就可以在Spring中注册这个aspect:

<bean class="com.codeproject.jackie.springrecipesnote.springaop.CalculatorLoggingAspect" />
<bean class="com.codeproject.jackie.springrecipesnote.springaop.CalculatorValidationAspect" />

      注意:aspect的优先级不取决于Bean声明的顺序。getOrder()方法返回的值越低就代表越高的优先级。

(2)@Order注解
      另一种指定优先级的方法是通过@Order注解。顺序值在注解值中出现。
package com.codeproject.jackie.springrecipesnote.springaop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;

/**
 * @author jackie
 * 
 */
@Aspect
@Order(0)
public class CalculatorValidationAspect {
	private Log log = LogFactory.getLog(this.getClass());
	
	@Before("execution(* *.*(double, double))")
	public void validateBefore(JoinPoint joinPoint) {
		for (Object arg : joinPoint.getArgs()) {
			log.info("validate begins...");
			validate((Double) arg);
		}
	}

	private void validate(Double arg) {
		if (arg < 0) {
			throw new IllegalArgumentException("Positive numbers only");
		}
	}
}

package com.codeproject.jackie.springrecipesnote.springaop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;

/**
 * @author jackie
 * 
 */
@Aspect
@Order(1)
public class CalculatorLoggingAspect{
	private Log log = LogFactory.getLog(this.getClass());

	/**
	 * 切入点表达式匹配ArithmeticCalculator接口的add()方法的执行。
	 * 表达式前导的星号匹配任何修饰符(public、protected和private)和任何返回类型。
	 * 参数列表中的两个点匹配任何数量的参数。
	 */
	@Before("execution(* ArithmeticCalculator.add(..))")
	public void logBefore() {
		log.info("The method add() begins");
	}
}


      

作者:jackiehff 发表于2013-5-8 16:46:11 原文链接
阅读:36 评论:0 查看评论

    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3