当前位置:  编程技术>移动开发
本页文章导读:
    ▪动态更替view类的背景----StateListDrawable的应用        动态更换view类的背景----StateListDrawable的应用 StateListDrawable可以根据View的不同状态,更换不同的背景 可以应用如EditText,Button等中,以Button为例  系统中默认的按钮被按下的颜色和未点.........
    ▪ 【so easy~】正则表达式惯用匹配        【so easy~】正则表达式常用匹配 http://androiddada.iteye.com/ 最近在Android开发,有用到j2ee常用到的正则,这里总结下Android下的用法(一位朋友的博文+自己的一点东西): 原例子:       //匹配.........
    ▪ https配合ssl和数字证书回保证传输和认证安全       https配合ssl和数字证书来保证传输和认证安全   在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了。本文追本溯源围绕这个模式谈一谈。 名词解.........

[1]动态更替view类的背景----StateListDrawable的应用
    来源: 互联网  发布时间: 2014-02-18
动态更换view类的背景----StateListDrawable的应用

StateListDrawable可以根据View的不同状态,更换不同的背景

可以应用如EditText,Button等中,以Button为例 

系统中默认的按钮被按下的颜色和未点击时的颜色不一样,该种实现可以用Java代码和XML实现

以Java代码:

//……前面对Button的声明略去
okBtn.setBackgroundDrawable(addStateDrawable(this, R.drawable.btn_normal, R.drawable.btn_selected, R.drawable.btn_selected));
cancelBtn.setBackgroundDrawable(addStateDrawable(this, R.drawable.btn_normal, R.drawable.btn_selected, R.drawable.btn_selected));

//……对应主要的代码
 //当对应的View处于不同的状态时,对应的bacdground跟着变化
    private StateListDrawable addStateDrawable(Context context,  int idNormal, int idPressed, int idFocused) {
    	StateListDrawable sd = new StateListDrawable();
    	Drawable normal = idNormal == -1 ? null : context.getResources().getDrawable(idNormal);
    	Drawable pressed = idPressed == -1 ? null : context.getResources().getDrawable(idPressed);
    	Drawable focus = idFocused == -1 ? null : context.getResources().getDrawable(idFocused);
    	//注意该处的顺序,只要有一个状态与之相配,背景就会被换掉
    	//所以不要把大范围放在前面了,如果sd.addState(new[]{},normal)放在第一个的话,就没有什么效果了 
    	sd.addState(new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}, focus);
    	sd.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, pressed);
    	sd.addState(new int[]{android.R.attr.state_focused}, focus);
    	sd.addState(new int[]{android.R.attr.state_pressed}, pressed);
    	sd.addState(new int[]{android.R.attr.state_enabled}, normal);
    	sd.addState(new int[]{}, normal);
    	return sd;
    }
 

xml方式实现时,可以先了解下对应xml的语法 

 

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android"

android:constantSize=["true" | "false"]

android:dither=["true" | "false"]

android:variablePadding=["true" | "false"] >

<item

android:drawable="@[package:]drawable/drawable_resource"

android:state_pressed=["true" | "false"]

android:state_focused=["true" | "false"]

android:state_selected=["true" | "false"]

android:state_active=["true" | "false"]

android:state_checkable=["true" | "false"]

android:state_checked=["true" | "false"]

android:state_enabled=["true" | "false"]

android:state_window_focused=["true" | "false"] />

</selector>

 

下面对应的具体实例,由于是做背景用,该xml将放于/res/drawable下面(StateList中第一个匹配当前状态的item会被使用。因此,如果第一个item没有任何状态特性的话,那么它将每次都被使用,这也是为什么默认的值必须总是在最后)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/btn_selected"/>
    <item android:state_focused="true" android:drawable="@drawable/btn_selected"/>
    <item android:state_enabled="true" android:drawable="@drawable/btn_normal"/>
    <item  android:drawable="@drawable/btn_normal" />
</selector>
    

在Button的xml中进行加载:

 <Button
            android:id="@+id/canel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:text="@string/btn_cancel"
            android:layout_margin="10dip"
            android:layout_weight="1"
            android:textColor="#ffffffff"
            android:textSize="15sp"
            android:background="@drawable/button_drawable"
            />

 或在java代码中加载:

 

okBtn.setBackgroundDrawable(R.drawable.button_drawable);
效果都一样。 

 


    
[2] 【so easy~】正则表达式惯用匹配
    来源: 互联网  发布时间: 2014-02-18
【so easy~】正则表达式常用匹配

http://androiddada.iteye.com/
最近在Android开发,有用到j2ee常用到的正则,这里总结下Android下的用法(一位朋友的博文+自己的一点东西):

原例子:  
    //匹配原则 以Java开头的任意字符结尾的字符串
    Pattern pattern = Pattern.compile("^Java.*");
    Matcher matcher = pattern.matcher("Java不是人");
    //判断匹配
    boolean b= matcher.matches();
  
   结果b = true
 
自己的例子 (识别.jpg图片连接):

Pattern p = Pattern.compile("^http://.*jpg$",
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(url);
if (m.find())
String url = m.group();


常用正则总结:
java中使用,需要注意对“\”的转义!

    1 。 ^ \d + $   // 匹配非负整数(正整数 + 0)  
      2 。 ^ [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * $   // 匹配正整数  
      3 。 ^ (( - \d + ) | ( 0 + ))$   // 匹配非正整数(负整数 + 0)  
      4 。 ^- [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * $   // 匹配负整数    
    5 。 ^-? \d + $     // 匹配整数    
    6 。 ^ \d + (\.\d + ) ? $   // 匹配非负浮点数(正浮点数 + 0)  
      7 。 ^ (([ 0 - 9 ] + \.[ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * \.[ 0 - 9 ] + ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ))$   // 匹配正浮点数  
      8 。 ^ (( - \d + (\.\d + ) ? ) | ( 0 + (\. 0 + ) ? ))$   // 匹配非正浮点数(负浮点数 + 0)  
      9 。 ^ ( - (([ 0 - 9 ] + \.[ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * \.[ 0 - 9 ] + ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * )))$   // 匹配负浮点数    
    10 。 ^ ( -? \d + )(\.\d + ) ? $   // 匹配浮点数    
    11 。 ^ [A - Za - z] + $   // 匹配由26个英文字母组成的字符串    
    12 。 ^ [A - Z] + $   // 匹配由26个英文字母的大写组成的字符串  
      1 3 。 ^ [a - z] + $   // 匹配由26个英文字母的小写组成的字符串    
    14 。 ^ [A - Za - z0 - 9 ] + $   // 匹配由数字和26个英文字母组成的字符串  
      15 。 ^ \w + $   // 匹配由数字、26个英文字母或者下划线组成的字符串    
    16 。 ^ [\w - ] + (\.[\w - ] + ) * @[\w - ] + (\.[\w - ] + ) + $     // 匹配email地址  
      17 。 ^ [a - zA - z] + : // 匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$   // 匹配url    
    18 。匹配中文字符的正则表达式: [\u4e00 - \u9fa5]  
    19 。匹配双字节字符(包括汉字在内):[ ^ \x00 - \xff] 
    20 。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len = function(){ return   this .replace([ ^ \x00 - \xff] / g, " aa " ).length;}  
    21 。匹配空行的正则表达式:\n[\s |  ] * \r  
    22 。匹配HTML标记的正则表达式: /< (. * ) > . *< \ / \ 1 >|< (. * ) \ />/   
    23 。匹配首尾空格的正则表达式:( ^ \s * ) | (\s * $) *   
    
    正则表达式用例   
    * 1 、 ^ \S + [a - z A - Z]$ 不能为空 不能有空格  只能是英文字母 
     *   2 、\S{ 6 ,}         不能为空 六位以上   
    *   3 、 ^ \d + $          不能有空格 不能非数字 
     *   4 、(. * )(\.jpg | \.bmp)$ 只能是jpg和bmp格式 
     *   5 、 ^ \d{ 4 }\ - \d{ 1 , 2 } - \d{ 1 , 2 }$ 只能是2004 - 10 - 22格式   
    *   6 、 ^ 0 $            至少选一项   
    *   7 、 ^ 0 { 2 ,}$        至少选两项   
    *   8 、 ^ [\s | \S]{ 20 ,}$ 不能为空 二十字以上 
     *   9 、 ^ \ +? [a - z0 - 9 ](([ -+ .] | [_] + ) ? [a - z0 - 9 ] + ) * @([a - z0 - 9 ] + (\. | \ - )) + [a - z]{ 2 , 6 }$邮件   
    *   10 、\w + ([ -+ .]\w + ) * @\w + ([ - .]\w + ) * \.\w + ([ - .]\w + ) * ([,;]\s * \w + ([ -+ .]\w + ) * @\w + ([ - .]\w + ) * \.\w + ([ - .]\w + ) * ) *  输入多个地址用逗号或空格分隔邮件   
    *   11 、 ^ (\([ 0 - 9 ] + \)) ? [ 0 - 9 ]{ 7 , 8 }$电话号码7位或8位或前面有区号例如( 022 ) 87341628    
    *   12 、 ^ [a - z A - Z  0 - 9  _] + @[a - z A - Z  0 - 9  _] + (\.[a - z A - Z  0 - 9  _] + ) + (\,[a - z A - Z  0 - 9  _] + @[a - z A - Z  0 - 9  _] + (\.[a - z A - Z  0 - 9  _] + ) + ) * $   *      只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件   
   


附件里放了正则测试器,方便大家使用 

http://androiddada.iteye.com/

 

1 楼 William_Sim 2012-01-06  
Why I'm so handsome
2 楼 trial989 2012-01-06  
字体颜色不方便阅读啊 改改吧
3 楼 chenowei 2012-01-08  
以前不知道怎么匹配中文。。。。3q了

    
[3] https配合ssl和数字证书回保证传输和认证安全
    来源: 互联网  发布时间: 2014-02-18
https配合ssl和数字证书来保证传输和认证安全

 

在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了。本文追本溯源围绕这个模式谈一谈。

名词解释

首先解释一下上面的几个名词:

https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。

SSL(Secure Socket Layer):是Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在https协议栈中负责实现上面提到的加密层。因此,一个https协议栈大致是这样的:

数字证书:一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。

加密和认证:加密是指通信双方为了防止铭感信息在信道上被第三方QieTing而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的骗子,采取的确认身份的方式。只有同时进行了加密和认真才能保证通信的安全,因此在SSL通信协议中这两者都被应。

因此,这三者的关系已经十分清楚了:https依赖一种实现方式,目前通用的是SSL,数字证书是支持这种安全通信的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT将SSL标准化之后产生的(TSL1.0),与SSL差别很小,后者是用于无线环境下的TSL。

如何加密

常用的加密算法:

  • 对称密码算法:是指加密和解密使用相同的密钥,典型的有DES、RC5、IDEA(分组加密),RC4(序列加密);
  • 非对称密码算法:又称为公钥加密算法,是指加密和解密使用不同的密钥(公开的公钥用于加密,私有的私钥用于解密)。比如A发送,B接收,A想确保消息只有B看到,需要B生成一对公私钥,并拿到B的公钥。于是A用这个公钥加密消息,B收到密文后用自己的与之匹配的私钥解密即可。反过来也可以用私钥加密公钥解密。也就是说对于给定的公钥有且只有与之匹配的私钥可以解密,对于给定的私钥,有且只有与之匹配的公钥可以解密。典型的算法有RSA,DSA,DH;
  • 散列算法:散列变换是指把文件内容通过某种公开的算法,变成固定长度的值(散列值),这个过程可以使用密钥也可以不使用。这种散列变换是不可逆的,也就是说不能从散列值变成原文。因此,散列变换通常用于验证原文是否被篡改。典型的算法有:MD5,SHA,Base64,CRC等。

在散列算法(也称摘要算法)中,有两个概念,强无碰撞和弱无碰撞。弱无碰撞是对给定的消息x,就是对你想伪造的明文,进行运算得出相同的摘要信息。也就是说你可以控制明文的内容。强无碰撞是指能找到相同的摘要信息,但伪造的明文是什么并不知道。

SSL的加密过程:

需要注意的是非对称加解密算法的效率要比对称加解密要低的多。所以SSL在握手过程中使用非对称密码算法来协商密钥,实际使用对称加解密的方法对http内容加密传输。下面是对这一过程的形象的比喻:

假设A与B通信,A是SSL客户端,B是SSL服务器端,加密后的消息放在方括号[]里,以突出明文消息的区别。双方的处理动作的说明用圆括号()括起。

  • A:我想和你安全的通话,我这里的对称加密算法有DES,RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。
  • B:我们用DES-RSA-SHA这对组合好了。这是我的证书,里面有我的名字和公钥,你拿去验证一下我的身份(把证书发给A)。
  • A:(查看证书上B的名字是否无误,并通过手头早已有的数字的证书验证了B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性)
  • (产生一份秘密消息,这份秘密消息处理后将用作对称加密密钥,加密初始化向量和hmac的密钥。将这份秘密消息-协议中称为per_master_secret-用B的公钥加密,封装成称作ClientKeyExchange的消息。由于用了B的公钥,保证了第三方无法QieTing)
  • 我生成了一份秘密消息,并用你的公钥加密了,给你(把ClientKeyExchange发给B)
  • 注意,下面我就要用加密的办法给你发消息了!
  • (将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥)
  • [我说完了]
  • B:(用自己的私钥将ClientKeyExchange中的秘密消息解密出来,然后将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥,这时双方已经安全的协商出一套加密办法了)
  • 注意,我也要开始用加密的办法给你发消息了!
  • [我说完了]
  • A: [我的秘密是...]
  • B: [其它人不会听到的...]

从上面的过程可以看到,SSL协议是如何用非对称密码算法来协商密钥,并使用密钥加密明文并传输的。还有以下几点补充:

  • B使用数字证书把自己的公钥和其他信息包装起来发送A,A验证B的身份,下面会谈到A是如何验证的。
  • A生成了了加密密钥、加密初始化向量和hmac密钥是双方用来将明文摘要和加密的。加密初始化向量和hmac密钥首先被用来对明文摘要(防止明文被篡改),然后这个摘要和明文放在一起用加密密钥加密后传输。
  • 由于只有B有私钥,所以只有B可以解密ClientKeyExchange消息,并获得之后的通信密钥。
  • 事实上,上述过程B没有验证A的身份,如果需要的话,SSL也是支持的,此时A也需要提供自己的证书,这里就不展开了。在设置IIS的SSL Require的时候,通常默认都是igore client certification的。
  • 数字证书

    由上面的讨论可以知道,数字证书在ssl传输过程中扮演身份认证和密钥分发的功能。究竟什么是数字证书呢?

    简而言之数字证书是一种网络上证明持有者身份的文件,同时还包含有公钥。一方面,既然是文件那么就有可能"伪造",因此,证书的真伪就需要一个验证方式;另一方面,验证方需要认同这种验证方式。

    对于第一个需求,目前的是,证书可以由国际上公认的证书机构颁发,这些机构是公认的信任机构,一些验证证书的客户端应用程序:比如浏览器,邮件客户端等,对于这些机构颁发的证书完全信任。当然想要请这些机构颁发证书可是要付"到了斯"的,通常在windows部署系统的时候会让客户端安装我们自己服务器的根证书,这样客户端同样可以信任我们的证书。

    对于第二个需求,客户端程序通常通过维护一个"根受信任机构列表",当收到一个证书时,查看这个证书是否是该列表中的机构颁发的,如果是则这个证书是可信任的,否则就不信任。

    证书的信任

    因此作为一个https的站点需要与一个证书绑定,无论如何,证书总是需要一个机构颁发的,这个机构可以是国际公认的证书机构,也可以是任何一台安装有证书服务的计算机。客户端是否能够信任这个站点的证书,首先取决于客户端程序是否导入了证书颁发者的根证书。下图说明了这个流程:

    有时一个证书机构可能授权另一个证书机构颁发证书,这样就出现了证书链。

    IE浏览器在验证证书的时候主要从下面三个方面考察,只要有任何一个不满足都将给出警告:

    • 证书的颁发者是否在"根受信任的证书颁发机构列表"中
    • 证书是否过期
    • 证书的持有者是否和访问的网站一致

    另外,浏览器还会定期查看证书颁发者公布的"证书吊销列表",如果某个证书虽然符合上述条件,但是被它的颁发者在"证书吊销列表"中列出,那么也将给出警告。每个证书的CRL Distribution Point字段显示了查看这个列表的url。尽管如此,windows对于这个列表是"不敏感"的,也就是说windows的api会缓存这个列表,直到设置的缓存过期才会再从CRL Distribution Point中下载新的列表。目前,只能通过在证书颁发服务端尽量小的设置这个有效期(最小1天),来尽量使windows的客户端"敏感"些。

    要实现ssl加密通信,必须要双方协商密钥,ssl采用的是非对称加密来实现密钥交换。在这个过程中,服务端向客户端发送的公钥就包含在证书中。客户端将自己生成的密钥用公钥加密,服务端用于公钥匹配的私钥解密。因此,可以想到的是,服务端保存了一个私钥,并且也与https的站点绑定了。


        
    最新技术文章:
    ▪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