当前位置:  浙ICP备11055608号-3 iis7站长之家
本页文章导读:
    ▪观模板方法模式的顿悟        看模板方法模式的顿悟   设计模式,这个词听起来真的有种很高深没测的感觉,很想去弄懂它,总感觉要想成为技术大牛,如果连这个都弄不懂,就感觉太差劲了,但每次下定决心去看时.........
    ▪ 后台老板运行-音乐播放器        后台运行--音乐播放器 主要用到类android.app.Servier 程序中包括 Activity01.java 和 MusicService.java   Activitu01.java中有两个按钮的监听,如下  //开始按钮     private OnClickListener start = new OnClickListener(.........
    ▪ UIView中的惯用方法       UIView中的常用方法 addSubview:   添加一个子视图到接收者并让它在最上面显示出来。    - (void)addSubview:(UIView *)view    讨论    这方法同样设置了接收者为下一个视图响应对象。接收者.........

[1]观模板方法模式的顿悟
    来源: 互联网  发布时间: 2014-02-18
看模板方法模式的顿悟


  设计模式,这个词听起来真的有种很高深没测的感觉,很想去弄懂它,总感觉要想成为技术大牛,如果连这个都弄不懂,就感觉太差劲了,但每次下定决心去看时,总是看不进去,要么觉得其中的术语太过于正式,很难看懂,还有就是总感觉看了也用不上。

  但今天在看模板方法模式时,才发现我已经使用过这个模式,只是自己不知道它就叫模板方法模式而已。

  首先我们来看模板方法模式的书面定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个定义实在是太讳涩了,我的理解是,如果我们有两个有很多相似代码的类时,我们常常会抽出一个公共的抽象类,把相同的代码放到这个抽象类中,同时把不同的代码,用抽象方法来代替,这些抽象方法再让子类去实现。其中的抽出来的公共的代码可以称之为算法的骨架(解决问题的主要步骤),由子类来实现的抽象方法就是将不同的一些步骤延迟到子类中。

  我们平时的把相同的代码抽到父类中去,其实这就是模板方法模式的思想,这个思想我们经常遇到,比如Activity这个类,其固定不变的生命周期方法,就可以认为是算法的骨架,我们通过继承这个类,实现其中的每个生命周期的方法,这就是将一些步骤延迟到子类中去。

  我们常常把相同的代码提到抽象的父类中去,也就我们常常用继承来实现模析方法模式,但这个方法有一定的局限性。我在写一套显示图片的缓存机制的时候,遇到了一个问题。问题是这样的,之前使用这套图片缓存机制的地方都是在ListView,GridView,GalleryView上,所以我可以写一个公共的Adapter(其继承于BaseAdapter),把相同的代码全部写在了这个Adapter上,变化的用抽象方法来表示,让子类去实现。

  但我后来发现使用这个图片缓存机制的地方除了ListView,GridView,GalleryView这些控件外,还会用在ViewSwitcher上,而使用这个控件是不需要BaseAdapter的,这时我有两种选择,一是:复制这些相同代码,另外单独再写一个类,二是:继续使用之前的公共Adapter,只是我不把它真正的BaseAdapter来用就行了。但我觉得这两种方法都不好,后来我想到的解决判法是:不用继承来重用代码,用组合加Java回调技术来重用代码。

  这时我就不把相同的代码写在抽象类里了,而是直接写在一个类里面,原来在抽象类里的抽象方法,我定义了一个接口,这个接口由使用这个公共类的类去实现,在公共类里,我只使用这个接口对象,这样同样也实现了为离相同的代码,变化的部分由使用者去实现,这样我就可以摆脱Java只能继承一个父类的问题,从而把使用ViewSwitcher和Listview,GalleryView,GridView的图片缓存机制的代码写在一块了。

  总结:Java回调方法和继承抽象类是实现模板方法模式的两种不同的实现。但我在解决这个问题的时候,并不知道自己就是使用模板方法模式。其实设计模式并没有那么高深和遥远,其实我们天天都在使用。看设计模式要结合自己的实际工作,从中进行总结和思考,只有这样才能真正的理解和掌握设计模式,才能真正的活用设计模式中的思想。

 


    
[2] 后台老板运行-音乐播放器
    来源: 互联网  发布时间: 2014-02-18
后台运行--音乐播放器

主要用到类android.app.Servier

程序中包括 Activity01.java 和 MusicService.java

 

Activitu01.java中有两个按钮的监听,如下

 //开始按钮

    private OnClickListener start = new OnClickListener(){


public void onClick(View v) {

//开启Service

startService(new Intent("com.jiang.MusicServic"));//这里的“com.jiang.MusicServic” 和 AndroidMainfest中 <action android:name="com.jiang.MusicServic" />相同

}

   

    };

    

    //停止按钮

    private OnClickListener stop = new OnClickListener(){

public void onClick(View v) {

//停止Service

stopService(new Intent("com.jiang.MusicServic"));

}

    };

 

 

MusicService.java 继承自Service.java

 

ackage com.jiang;

 

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.IBinder;

 

public class MusicService extends Service{

//android.media.MediaPlayer对象

private MediaPlayer player;

@Override //重写onBind方法

public IBinder onBind(Intent intent) {

return null;

}

@Override //重写onStart方法

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

//这里可以理解为装载音乐文件

player = MediaPlayer.create(this,R.raw.test);

//开始播放

player.start();

}

@Override //重写onDestroy方法

public void onDestroy() {

super.onDestroy();

//停止音乐-停止Service

player.stop();

}

}

 

另外在AndroidMainfest.xml中是

 

 <service android:name=".MusicService">

        <intent-filter>

        <action android:name="com.jiang.MusicServic" />

        <category android:name="android.intent.category.default" />

        </intent-filter>

        </service>

 


    
[3] UIView中的惯用方法
    来源: 互联网  发布时间: 2014-02-18
UIView中的常用方法
  • addSubview:  
  • 添加一个子视图到接收者并让它在最上面显示出来。   
  • - (void)addSubview:(UIView *)view   
  • 讨论   
  • 这方法同样设置了接收者为下一个视图响应对象。接收者保留视图。如果你使用removeFromSuperview方法用来把视图移除他的显示列表,那么视图将会被释放。如果你想要在视图移除显示列表後保留并使用这个视图(如果,举个例子,你想要交换一些视图的位置。),你不许保留那个视图在他调用removeFromSuperview前。   
  •   
  • bringSubviewToFront:  
  • 把指定的子视图移动到顶层   
  • - (void)bringSubviewToFront:(UIView *)view   
  • 参数   
  • view   
  • 需要移到顶层的视图   
  •   
  • convertPoint:fromView:  
  • 把一个点从一个坐标系转换到接收者的坐标系   
  • - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view   
  • 参数   
  • point   
  • 一个视图中坐标系上的点   
  • view   
  • 一个视图包含了点和他自身坐标系。如果是图是nil,那么这个方法将尝试转换基于窗口的坐标系。否则视图和那个接收者必须属于同一个UIWindow对象。   
  • 返回值   
  • 一个转换到接收者坐标系的点   
  •   
  • convertPoint:toView:  
  • 转换一个点从接收者坐标系到给定的视图坐标系   
  • - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view   
  • 参数   
  • point   
  • 一个在调用者坐标系中的点   
  • view   
  • 一个包含了需要被转换的点的视图。如果视图是nil,那么这个方法将会转换成基于窗口的坐标。否则视图和接收者都要属于同一个UIWindow对象。   
  • 返回值   
  • 基于视图的坐标系转换过的点   
  •   
  • convertRect:fromView:   
  • 转换一个矩形从其他视图坐标系到接收者坐标系。   
  • - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view   
  • 参数   
  • rect   
  • 一个在视图坐标系中的矩形   
  • view   
  • 一个视图内部有矩形在他的坐标系中。如果视图是nil,那么这个方法将会基于窗口来转换。否则视图和接收者必须都属于同一个UIWindow对象   
  • 返回值   
  • The converted rectangle   
  • 转换过的矩形   
  •   
  • convertRect:toView:  
  • 转换接收者坐标系中的矩形到其他视图   
  • - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view   
  • 参数   
  • rect   
  • 一个在接收者坐标系中的矩形   
  • view   
  • 要转换过去的目标视图对象。如果这个是视图是nil,这个方法将会基于窗口坐标系来转换。否者视图和接收者必须属于同一个UIwindow对象   
  • 返回值   
  • 一个转换过的矩形   
  •   
  • didAddSubview:  
  • 告诉视图当子视图已经添加   
  • - (void)didAddSubview:(UIView *)subview   
  • 参数   
  • subview   
  • 被添加做子视图的视图对象   
  • 讨论   
  • 被子类重写用来执行额外的命令当子视图添加到接收者。这个方法被addSubview调用   
  •   
  • didMoveToSuperview   
  • 通知接收者父视图已经改变(nil是允许的)   
  • - (void)didMoveToSuperview   
  • 讨论   
  • 默认不做任何事情;子类可以重写这方法来作为特定的实现   
  •   
  • didMoveToWindow   
  • 通知接收者它一斤给添加到窗口中   
  • - (void)didMoveToWindow   
  • 讨论   
  • 默认实现不做任何事情;子类可以重写这个方法来做特殊的实现   
  • 窗口的属性有可能是nil当这个方法调用的时候,这表明接收者并不属于当然任何一个窗口。这个只发生在接收者从它的父视图上移除或者接收者添加到父视图中而不是添加到window中。重写这个方法可以用来选择忽略一些他们不关心的对象   
  •   
  • drawRect:  
  • 在接收者视图中绘制矩形   
  • - (void)drawRect:(CGRect)rect   
  • 参数   
  • rect   
  • 一个定义的需要绘制的矩形   
  • 讨论   
  • 子类重写这个方法如果他们确实要绘制他们自定义的视图。如果子类是其他视图的容器那么它不需要重写这个方法。默认的实现不做任何事情。如果你自定义的视图是一个UIView子类,你不需要去调用它的父类实现。注意如果它的父类实现绘制并且不透明属性为YES那么每一个子类都需要填充矩形。   
  • 当这个方法被调用,接收者可以假定他的帧在坐标上已经转换,边界矩形已经应用;所有他要做的就是绘制自定义的方法。使用UIGraphicsGetCurrentContext方法去获取当前图形内容用来绘制,坐标原点在左上角。不要保留图片内容当他可以被drawRect:这个方法调用。   
  • exchangeSubviewAtIndex:withSubviewAtIndex:  
  • 交换接收者的子视图和给定的索引视图   
  • - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2   
  • 参数   
  • index1   
  • 一个需要取代索引2的子视图   
  • index2   
  • 一个需要取代索引1的子视图   
  •   
  • hitTest:withEvent:  
  • 返回接收者视图层次中最远的派生(包括它本身)的特定的点。   
  • - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event   
  • 参数   
  • point   
  • 接收者坐标系中的点   
  • event   
  • 触发这个方法的事件或者是如果这个方法被预调用就返回nil   
  • 返回值   
  • 一个视图对象最远的派生点。如果这个点位于接收者之外就返回nil   
  • 讨论   
  • 这个方法贯穿视图的层次发送pointInside:withEvent: 消息到每一个子视图用来决定那个子视图需要接收触摸事件。如果pointInside:withEvent: 返回YES,那么视图的层次全部贯穿;否则视图层次的分支是被否定的。你不太需要调用这个方法,但是你需要重写它用来隐藏子视图的触摸事件。   
  • 如果视图是隐藏的,禁止用户交互的或者透明值小于01那么这个方法不可用   
  •   
  • initWithFrame:  
  • 初始化并返回一个新的拥有特定帧矩形的视图对象   
  • - (id)initWithFrame:(CGRect)aRect   
  • 参数   
  • aRect   
  • 一个帧矩形用来创建视图对象。原始的帧在它的父视图的坐标系中。设置这个属性用来改变中心和边界属性。   
  • 返回值   
  • 一个初始化的视图对象,如果没有被创建那就返回nil   
  • 讨论   
  • 一个新的视图对象必须添加到视图链中才能使用。这个方法为UIView类指出初始化对象。   
  •   
  • insertSubview:aboveSubview:   
  • 在视图层次顶层插入一个视图   
  • - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview   
  • 参数   
  • view   
  • 一个插入被用来放在顶层的视图。它将会从父视图中移除如果它不是相邻视图   
  • siblingSubview   
  • 一个相邻视图用来放在插入视图的後面  
  •   
  • insertSubview:atIndex:   
  • 插入视图到指定的索引   
  • - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index   
  • 参数   
  • view   
  • 插入的视图,这个值不能是nil   
  • index   
  • 子视图索引从0开始并且不能大于子视图的数量   
  •   
  • insertSubview:belowSubview:   
  • 插入视图到显示链的底层   
  • - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview   
  • 参数   
  • view   
  • 一个需要插入到其他视图底部的视图。它将从它的父视图移除如果它不与相邻视图的相邻   
  • siblingSubview   
  • 一个相邻视图将会在插入的视图之上   
  •   
  • isDescendantOfView:   
  • 返回一个布尔值指出接收者是否是给定视图的子视图或者指向那个视图   
  • - (BOOL)isDescendantOfView:(UIView *)view   
  • 参数   
  • view   
  • 一个视图用来测试子视图在视图层次中的关系   
  • 返回值   
  • 如果接收者是视图的子视图就返回YES,或者视图就是接收者;否则就是NO   
  •   
  • layoutIfNeeded   
  • 排列子视图如果需要的话   
  • - (void)layoutIfNeeded   
  • 讨论   
  • 使用这个方法来关注子视图的排列在绘制前   
  •   
  • layoutSubviews   
  • 排列子视图   
  • - (void)layoutSubviews   
  • 讨论   
  • 当layoutIfNeeded被调用是子类用来重写这个方法来排列子视图。默认实现这个方法不做任何事情。   
  •   
  • pointInside:withEvent:   
  • 返回一个布尔值指出接收者是否包含特定的点   
  • - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event   
  • 参数   
  • point   
  • 一个在接收者坐标系内的点   
  • event   
  • 这个方法的目标事件或者如果这个方法被预调用返回nil   
  • 返回值   
  • 如果点在接收者边界内返回YES,否则返回NO   
  •   
  • removeFromSuperview   
  • 把接收者从它的父视图或者窗口移除,并在响应链中移除。   
  • - (void)removeFromSuperview   
  • 讨论   
  • 接收者同时释放;如果你计划重用它,要确定在发送消息前保持它并在添加到其他UIView对象作为子视图後移除。 不要在显示的时候调用   
  •   
  • sendSubviewToBack:   
  • 移动指定的子视图到它相邻视图的後面   
  • - (void)sendSubviewToBack:(UIView *)view   
  • 参数   
  • view   
  • 一个子视图用来移动到它後面去   
  •   
  • setNeedsDisplay   
  • 控制接收者的边界矩形被标记为需要显示   
  • -(void)setNeedsDisplay   
  • 讨论   
  • 默认情况下,视图几何图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。从这个意义上来说,向视图发送setNeedsDisplay消息。任何UIView对象标记为需要显示後将会在应用程序循环中自动重新绘制。   
  •   
  • setNeedsDisplayInRect:   
  • 标记接收者中的特定的矩形区域为需要显示,或者添加接收者现有的其他无效区域   
  • - (void)setNeedsDisplayInRect:(CGRect)invalidRect   
  • 参数   
  • invalidRect   
  • 标记接收者的矩形区域为无效的;他需要在接收者坐标系中定义。   
  • 讨论   
  • 默认情况下,视图几何图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。使用这个方法或者用setNeedsDisplay方法来标记视图需要显示的地方。   
  •   
  • setNeedsLayout   
  • 设置当子视图显示的时候需要重新排列   
  • - (void)setNeedsLayout   
  • 讨论   
  • 如果你调用这个方法在下一个显示方法之间,那么layoutIfNeeded排列子视图;否则将不会做任何事情   
  •   
  • sizeThatFits:   
  • 计算并返回一个最好的适应接收者子视图的大小   
  • - (CGSize)sizeThatFits:(CGSize)size   
  • 参数   
  • size   
  • 接收者首选的尺寸   
  • 返回值   
  • 一个新的大小用来适应接收者子视图   
  • 讨论   
  • 默认的实现返回大小参数 子类重写这个方法用来返回特定视图的大小。举个粒子,UISwitch返回一个修正过的大小,UIImageView返回图片的大小 这个方法并没有改变接收者的大小   
  •   
  • sizeToFit  
  • 调整大小并移动接收者视图大小所以他包含了他的子视图   
  • - (void)sizeToFit   
  • 讨论   
  • 这个方法使用sizeThatFits: 方法来决定大小。子类需要重写sizeThatFits:用来计算正确的尺寸大小。默认的实现不做任何事情。   
  •   
  • viewWithTag:   
  • 返回视图的特定的标签   
  • - (UIView *)viewWithTag:(NSInteger)tag   
  • 参数   
  • tag   
  • 一个用来在视图中搜索的标签   
  • 返回值   
  • 视图在接收者层次中符合的标签,接收者也包含在搜索中。   
  •   
  • willMoveToSuperview:   
  • 通知接收者他的父视图将会改变到特定的父视图(也有可能是nil)   
  • - (void)willMoveToSuperview:(UIView *)newSuperview   
  • 参数   
  • newSuperview   
  • 新的视图对象将会是接收者新的父视图   
  • 讨论   
  • 子类可以重写这个方法来做一些特定的行为   
  •   
  • willMoveToWindow:   
  • 通知接收者它已经被添加到特定的窗口对戏那个的视图层次中(也有可能是nil)   
  • - (void)willMoveToWindow:(UIWindow *)newWindow   
  • 参数   
  • newWindow   
  • 一个窗口对象将会成为接收者新的视图层次的根视图   
  • 讨论   
  • 子类可以重写这个方法来提供一些特定的必要实现   
  •   
  • willRemoveSubview:   
  • 由子类重写用来在子视图从接收者视图中移除前执行一些特定的方法。   
  • - (void)willRemoveSubview:(UIView *)subview   
  • 参数   
  • subview   
  • 子视图将会被移除   
  • 讨论   
  • 这个方法被调用当子视图接收到removeFromSuperview消息或者子视图从接收者视图层次中移除因为它要被添加到其他视图了  

  •     
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


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

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

    浙ICP备11055608号-3