当前位置:  网络技术 iis7站长之家
本页文章导读:
    ▪浅谈C#中的数据类型       C#语言是一种强类型语言,在程序中用到的变量、表达式和数值等都必须有类型,编译器检查所有数据类型操作的合法性,非法数据类型操作不会被编译。c#中,两种不同性质的数据类型.........
    ▪协调多个对象之间的交互——中介者模式(二)      20.2 中介者模式概述       如果在一个系统中对象之间的联系呈现为网状结构,如图20-4所示。对象之间存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响.........
    ▪SystemUI之:Notification前世今生       systemUI之notification 好久没写东西,我得承认,是自己懒了。 解过几个statusbar的bug,觉得notification还是挺有意思的,分析一下流程,以作备忘吧。 通知的接收 1.    notification由.........

[1]浅谈C#中的数据类型
    来源: 互联网  发布时间: 2013-11-10



C#语言是一种强类型语言,在程序中用到的变量、表达式和数值等都必须有类型,编译器检查所有数据类型操作的合法性,非法数据类型操作不会被编译。c#中,两种不同性质的数据类型,分别是值类型和引用类型。

值类型

1)概念

包含实际数据的量。定义一个值类型的变量时,根据它所声明的类型,以堆栈方式分配一块大小相适应的

存储区域给这个变量,随后对这个变量的读或写操作就直接在这块内存区域进行。

例如:int i =12;

堆栈上分配三十二位内存,并将赋给i的值12传递给分配的32位内存中

2)种类

简单类型/基本类型

包括 整数类型、字符类型、实数类型和布尔类型

整数类型

布尔类型

取值只能是ture或者false,bool类型对应于.NET类库中的System.Boolean结构。它在计算机中占4个字

节,即32位存储空间。
字符类型

C#中采用Unicode字符集来表示字符类型。

实数类型

枚举类型


    
[2]协调多个对象之间的交互——中介者模式(二)
    来源: 互联网  发布时间: 2013-11-10
20.2 中介者模式概述

       如果在一个系统中对象之间的联系呈现为网状结构,如图20-4所示。对象之间存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对象,它们之间通过彼此的相互作用实现系统的行为。在网状结构中,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统。

图20-4 对象之间存在复杂关系的网状结构

      中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,如图20-5所示。在这个星形结构中,同事对象不再直接与另一个对象联系,它通过中介者对象与另一个对象发生相互作用。中介者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入带来大量的修改工作。

图20-5 引入中介者对象的星型结构

      如果在一个系统中对象之间存在多对多的相互关系,我们可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用。

 

      中介者模式定义如下:

中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

      在中介者模式中,我们引入了用于协调其他对象/类之间相互调用的中介者类,为了让系统具有更好的灵活性和可扩展性,通常还提供了抽象中介者,其结构图如图20-6所示:

图20-6 中介者模式结构图

      在中介者模式结构图中包含如下几个角色:

      ● Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。

      ● ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。

      ● Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。

      ● ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。

 

      中介者模式的核心在于中介者类的引入,在中介者模式中,中介者类承担了两方面的职责:

       (1) 中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用。该中转作用属于中介者在结构上的支持。

      (2) 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致的和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。

      在中介者模式中,典型的抽象中介者类代码如下所示:

abstract class Mediator {
	protected ArrayList<Colleague> colleagues; //用于存储同事对象

    //注册方法,用于增加同事对象
	public void register(Colleague colleague) {
		colleagues.add(colleague);
	}

	//声明抽象的业务方法
	public abstract void operation();
}

       在抽象中介者中可以定义一个同事类的集合,用于存储同事对象并提供注册方法,同时声明了具体中介者类所具有的方法。在具体中介者类中将实现这些抽象方法,典型的具体中介者类代码如下所示:

class ConcreteMediator extends Mediator {
    //实现业务方法,封装同事之间的调用
	public void operation() {
		......
		((Colleague)(colleagues.get(0))).method1(); //通过中介者调用同事类的方法
		......
	}
}

      在具体中介者类中将调用同事类的方法,调用时可以增加一些自己的业务代码对调用进行控制。

      在抽象同事类中维持了一个抽象中介者的引用,用于调用中介者的方法,典型的抽象同事类代码如下所示:

abstract class Colleague {
	protected Mediator mediator; //维持一个抽象中介者的引用
	
	public Colleague(Mediator mediator) {
		this.mediator=mediator;
	}
	
	public abstract void method1(); //声明自身方法,处理自己的行为
	
	//定义依赖方法,与中介者进行通信
	public void method2() {
		mediator.operation();
	}
}

       在抽象同事类中声明了同事类的抽象方法,而在具体同事类中将实现这些方法,典型的具体同事类代码如下所示:

class ConcreteColleague extends Colleague {
	public ConcreteColleague(Mediator mediator) {
		super(mediator);
	}
	
    //实现自身方法
	public void method1() {
		......
	}
}

      在具体同事类ConcreteColleague中实现了在抽象同事类中声明的方法,其中方法method1()是同事类的自身方法(Self

    
[3]SystemUI之:Notification前世今生
    来源: 互联网  发布时间: 2013-11-10

systemUI之notification

好久没写东西,我得承认,是自己懒了。

解过几个statusbar的bug,觉得notification还是挺有意思的,分析一下流程,以作备忘吧。

  • 通知的接收

1.    notification由系统或第三方应用封装发出notificationManager.notify()。

2.    通知进入一个队列NotificationManagerService.enqueueNotificationInternal()。

3.    在上面方法里面会发现一个熟悉的身影,就是mStatusBar,它是StatusBarManagerService的化身。调用mBar.addNotification(key,notification);

4.    通过linux查找命令先定位IStatusBar.aidl的位置,然后在该最外路径下搜索IStatusBar.Stub可以找到具体实现它的java文件,这里我们找到了CommandQueue,java。然后调用CommandQueue. addNotification(),该方法利用handle发出一个消息:MSG_ADD_NOTIFICATION,跳转到回调函数addNotification(ne.key,ne.notification); PhoneStatusBar实现了这个回调方法。

5.    以上一个通知算是被系统所接收到。

  • 通知的statusbar显示
public void addNotification(IBinder key, StatusBarNotification notification) {
    	// 1.初始化一个状态栏图标来体现该notification
        StatusBarIconView iconView = addNotificationViews(key, notification);
        if (iconView == null) return;
        }
        if (immersive) {
            //无实际作用,4.1会被注释
        } else if (notification.notification.fullScreenIntent != null) {
            // 2.not immersive & a full-screen alert should be shown,比如电话和闹钟的通知灰常nb
            Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
            try {
                notification.notification.fullScreenIntent.send();
            } catch (PendingIntent.CanceledException e) {
            }
        } else {
            // 3.usual case: status bar visible & not immersive。普通notification都走这道,用一个动画的形式显示该通知的文字信息。
            tick(notification);
        }

        // 4.Recalculate the position of the sliding windows and the titles.
        setAreThereNotifications();
        // 5.刷新一下ExpandedView的位置,
        updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
    }
  • 通知的expendView显示

代码都在上一步走完了。

条目的添加是addNotificationViews():

// 1.Construct the expanded view.
   NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);

view的刷新是addNotification():

// 5.刷新一下ExpandedView的位置,
   updateExpandedViewPos(EXPANDED_LEAVE_ALONE);

  • 通知的更新

同样是从CommandQueue. updateNotification()开始走,然后到PhoneStatusBar. updateNotification()。代码流程和通知的添加几乎一致,只是没有add view这一步。

  • 通知的发送

protected void sendNotification() {
		// TODO Auto-generated method stub
		Log.e(TAG, "-----sendNotifications----");
//		1.实例化intent和获取通知的服务。
		Intent mIntent = new Intent();
		 NotificationManager notificationManager = (NotificationManager) mContext
         .getSystemService(Context.NOTIFICATION_SERVICE);
		mIntent.setClass(mContext, ShowHello.class);
		PendingIntent mPendingIntent = PendingIntent.getActivity(mContext, 0, mIntent, 0);
//		2.设置通知的相应属性
//		mNotification.fullScreenIntent = mPendingIntent;//这句话的作用是决定通知是否自动弹出那个可跳转的activity。
		mNotification.defaults |= Notification.DEFAULT_SOUND;//设置通知是否播放声音。
		mNotification.flags = Notification.FLAG_ONGOING_EVENT;
//		在4.0的expendview里多显示一张图片,2.3系统会报错
		mNotification.largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_search);
//		显示通知调用下面的方法是必须的,但在api11会被deprecated,使用Notification.Builder代替。
		mNotification.setLatestEventInfo(mContext, tick, TAG, mPendingIntent);
//		3.唤醒通知
		notificationManager.notify(R.drawable.ic_launcher, mNotification);
	}

  • 各个主要版本的变化

分析时是以4.0为准,为了兼顾其他也顺便看了一遍2.3,4.1的流程,notification总的来说没有大的变化,API升级后有些方法被弃用有了新的实现,与之相关的就是状态栏为了适配pad和更高分辨率机型进行了一些重构,体现在我们这里就是2.3的statusBarService在4.0后改名为phoneStatueBar。4.0加入的immersive模式在4.1被彻底废除。

  • 三言两语

Notification的前世来生也就这样,生平中有过纠结的是NotificationManager,NotificationManagerService,StatusBarManagerService,phoneStatueBar,CommandQueue。

作者:aaa2832 发表于2013-1-8 21:29:39 原文链接
阅读:12 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


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

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

浙ICP备11055608号-3