Android中IntendService的使用

IntentService介绍

要想了解IntentService首先要知道它的父类Service的功能

1.Service

Service是android 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service的启动有两种方式:context.startService() 和 context.bindService()。这里的context可以简单地先理解为我们常用的Activity。

使用context.startService() 启动Service是会会经历:context.startService()  ->onCreate()->onStart()->Service running->context.stopService() | ->onDestroy() ->Service stop

如果Service还没有运行过,则android软件先调用onCreate()然后调用onStart();如果Service已经运行,则只会调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。

所以调用startService的生命周期为:onCreate –> onStart(可多次调用) –> onDestroy。

而我们通过startService()的方式调用Service时,可以通过重写其中的onCreate,onStart和onDestory三个方法来实现我们的具体需求,其中我个人认为最重要的是重写onStart方法,主要是因为onStart方法可多次调用。

使用context.bindService()启动Service会经历:

context.bindService()->onCreate()->onBind()->Service running->onUnbind() -> onDestroy() ->Service stop

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

其中是选择通过startService还是bindService的方式取决于context是否需要得到Service的运行信息或者说返回值,如果需要得到的话,则一定要采取bindService的方式。

2.IntentService

IntentService与它的父类Service的最大区别可以理解为IntentService是实现了多线程的Service。我们调用Service时,Service只是在后台运行,我们看不到而已,但实际上需要等Service在后台运行完毕我们才能进行下一步操作,而如果后台运行的Service是非常耗时的,则前台的程序就会出现假死状态,这是我们不希望看到的。

IntentService就是为解决这个耗时而产生的,在调用IntentService时,IntentService所进行的操作会像Java中的线程一样,动态获得系统的内存,同时前台可继续进行其他操作,这就很好的解决了Service中耗时的问题。IntentService中最重要的部分就是重写其中的onHandleIntent(Intent)方法,接收一个Intent对象,进行一系列的操作。当IntentService接收到多个任务后,会按顺序逐个执行,执行完后对应的IntentService会自动停止。

3.Service与IntentService的使用效果对比

我写了一个小程序来简单地对比Service和IntentService的实际效果。

在主程序中启动Service和IntentService没有任何区别,但是通过startService方式启动的Service需要调用stopService才能停止。而通过startService方式启动的IntentService会在工作完成后自动停止。

IntentService与Service在编写是最大的不同有亮点,一是最好能写一个默认的构造方法,否则会报无法实例化服务的错误,这个错误的排查花了我很多功夫。二是需要重写IntentService中的onHandleIntent方法,里面是我们要调用线程在后台执行的关键部分。

这是效果的对比图,点击调用Service,如果Service运行的是一个耗时操作,前台界面会呈现假死状态,无法进行进一步操作,很多时候这种情况是我们不愿看到的。而点击调用IntentService后,ItentService会在后台自动运行(即使有多个),而用户可点击前台界面做进一步操作。

4.总结

虽然Service和IntentService都市所谓的后台服务,我个人意见,如果是非耗时的操作,推荐用Service,Service用起来简单。而如果是耗时的操作,则强烈建议使用IntentService。

分享:2012年网页设计趋势

一年将又过去了,让我们来看看跟着下来的一年网页设计将会有什么新趋势。网页设计如万物般变化万千,但总有其规律,我们是可以预见它即将要变化的地方。随着时间的迁移,人们的视觉的改变,网页设计趋势的改变是必然的,作为网页开发者,网页设计师,需要做的是紧跟时代的脚步,时刻关注网页设计趋势的变化而变。
1.png

当你阅读此文时,你可能会发现有些变化跟“2011年网页设计发展趋势”中提到的相差不大,也可能有些变化你已经意识到。一切都不奇怪,趋势不是瞬间的,趋势的变化是一个过程。
1、响应式网页设计我相信将来我们不再会在趋势中讨论响应式网页设计,不是因为它将会消失,而是网页设计必需的原则。不过,我认为2012年暂时不会出现这样的局面。因为它还属于比较新的概念,目前还有很多设计师对该概念还不是很熟悉。
2.png
2012年将会有更多的移动设备继续引进和采用响应式网页设计。网页设计师和开发者将会使用将使用流体布局,而不是固定宽度,更多的样式表被查询设备选择 – 这样让网站在不同屏幕尺寸的设备都能够拥有完美的显示。
2.固定位置的导航我们看到很多个人网站和博客已经开始采用这种设计。但我发现这种风潮在2010-2011年期间曾有所回落,但在最近几个月开始回潮。
如果你的网站的导航并不需要放置太多的链接,寥寥几个主要链接为何不保持用户始终可见?这可以大大提供网站的性能甚至更易于融入整个页面布局。这种设计锁定导航和链接/logo在固定的位置,即使用户固定页面也能快速通过导航访问其他页面。
3.png
现在使用一些jQuery原型即可快速达到这种效果。即使没有JavaScript,也可以使用一些炫酷的CSS Code以达到效果。在2011年已经有很多网站的使用固定的导航栏,即导航不随页面滚动或页面切换而改变位置和重新载入,始终悬放页屏幕的一个位置。Simon Wuyts 就是用了这一效果,你可以通过实例体验这种技术。
4.png
 

以前的你可能从不会考虑将页面设计成易于显示的幻灯片风格。不过,这不单能消除分辨率不兼容的顾虑,而且导航系统更易于使用和对移动浏览器完美兼容。在即将来临的2012年里我建议你重新考虑这种设计,重新对页面进行布局。
3. 圆形设计这一趋势其实已在网页设计有点明显,但近几年有点偃旗息鼓。在Web2.0热潮,设计师更注重基于台式机的趋势,如阴影和圆角。但使用CSS3,就可以轻松实现花俏的方块效果。
此外,你可以设计圆形式和阴影不需要使用任何图片。由于这些功能,设计师开始从另一个角度看图像。一直以来我都留意设计师们的各种设计,发现圆形元素的使用频率越来越大。这些圆形设计可以作为导航链接,页脚图标,甚至可用于个人作品等展示。
5.png

But the most extreme examples aren’t always the best. 圆形让图像看起来更加光滑舒服,更容易吸引访客的目光和关注。使用这些元素特别标注设计中的特别区域,如有用的资源和主要的页面等。但切勿为了形状本身而忽略效果,否则适得其反。
6.png
4. 大幅矢量图你可以在你的网站使用超大的吉祥物打造你的品牌。几年前你很难在网络品牌中找到使用大量矢量图的案例。但现在设计师的专业水平越来越高,这样我想不到比使用可爱的动画矢量图来营销品牌的点子。
7.png
Mozilla和Firefox的动物形象矢量图就是一个不错的例子。MailChimp则又是一个优秀的案例,品牌形象的个子就更大了。无论是网站还是 iOS、Android应用都能清晰看到那只有趣的猴子邮递员。
8.png
此外Freelance Switch网站的吉祥物小帅哥,也是我久不能忘的设计。你可以在他们的网站布局发现各种各样的吉祥物矢量图。这种做法已经成为网站美学的新境界,我有理由相信2012年你将会到处都看到这些可爱的矢量标志设计。
5. 多列菜单不同于前面的例子,有时候有的网站的链接较多需要处理。若按照标准型的导航排列会显得过于凌乱和拥挤,除非你将链接放置到边栏。但经验告诉我们,链接放置在页面顶部,有利于用户体验。
9.png
跟着下来的一年或者新的趋势会改变这个局面,设计师可以对页面导航重建。跟着下来的一年或者新的趋势会改变这个局面,设计师可以对页面导航重建。思维是一张黑白画,但却意境无限,等待你的挖掘。多列布局的导航更美让人看起来更舒服,通过这种方式你可以在Logo周围显示更多的链接给网站的访客。
10.png
创造舒适的设计风格的最佳方式是实践,阅读最近的关于网页设计的一些文章来学习Web导航设计的最新趋势。作为设计师,应该拥有跳跃的思维,尝试最新的东西。对标准的导航设计进行改革是每个设计师都要坚持的实践活动。
6. jQuery/CSS3/HTML5动画我经常推荐的jQuery插件。网页设计必须包括用户体验、美学和动画等多方面的内容。随着JQuery和CSS3的不断进步,现在可以用很少的代码就能达到非常酷的效果。
过去的一年我不断地学习网络上相关的教程。了解到jQuery是目前前端效果最优秀的但并不是所有浏览器都支持。因此,通过CSS来实现浏览器兼容也不失是个好办法。2012年越来越近,相信开发者们又有了新的动态,让我们拭目以待,期待jQuery/CSS3/HTML5时代的到来。
7.丝带及横幅图形在2011年我就开始密切注意到这样的设计元素。设计师们开始编写关于设计丝带风格页面、横幅、书签或其他类型的徽章的教程。大量免费教程的出现使得越来越多设计师开始跟随这样的趋势。
11.png
你很可能为过去短短的6个月里出现这种风格设计的网站的数量感到惊讶。勇于尝新的设计师们频繁在新的软件和移动应用程序中使用丝带设计风格。此外你会发现博客免费下载或者热门文章栏目使用这类的横幅设计。我还特别地收集了这类的设计的PSD素材,有兴趣的可以尝试下载来参看下:

8. 自定义字体免费字体库Typekit为任何感兴趣的网页设计师提供免费试用。有了这个工具你在网站嵌入JavaScript即可在CSS中实现自定义字体。在2011年这个趋势已经很明显,已经有部分WordPress设计师尝试使用这方法让自己的博客变得与众不同。
几年前,Typekit还是一个不起眼的系统,直到现在Google Web Fonts提供资金支持,现在它开始变得非常受欢迎。你只要找到字体库拥有的字体,Goole就提供相应的代码。你只需要在HTML添加相应的代码和CSS修改字体名称。
12.png

越来越多的人开始使用这样服务。甚至有开发人员专门开发了免费的插件,这样安装自定义字体就变得更加简单了。不需要上传字体,没有服务器压力和鲜有出现错误。博主们应该关注这个趋势,使用一些适合自己的博客的字体。
9.信息图表这个趋势或者对网页设计的大局影响不大,但有利于用户体验和信息图表符合新媒体的发展。以前鲜有网站使用这样的方式,即使你勉强了解当中所展示的数据、图表或图像。
13.png
信息图表并不是对所有网站都适用。而且制作这样的图表需要花费大量的时间在Photoshop上。但如果你是这方面的人才,自己的网站有需要这样的图标,不妨尝试下,会给你的网站访客全新的感受。相比以前,现在的网络包含更多的信息,我们可以从中收取或共享信息,而信息图表正是这样的体验,能够加快互联网的发展和体验互联网精神。
10. 简洁任何网站都有一个目的就是使访客从A点访问到B点。简单,直观的界面是最直接的方法。在过去的5年,我发现现在越来越流行简单的设计。道理很简单,页面元素也少,游客自然将目光集中在内容和链接上。
我们可以找到很多这样的例子。在今年五月,我们就列举一批非常优秀的案例
14.png

但重新布局一个简单的界面并不是一件易事。你需要起草导航架构,页面层次结构,头部,内容区域等。不过花时间做好规划可以大大简化你的工作。
小结以上趋势仅仅是我们根据现阶段和以前网页设计的发展历史所预测,但未来是不可以预知的,因此未来的网页设计会不断地变化。现在的网页设计师也一直地学习和尝试新的东西,只要我们时刻留意网页设计的发展,学习新的技术和设计,相信所设计的网页也会相当不错的。
早前知名博客flashuser也发布了关于2012年网页设计趋势,其中有相同的地方也有不同地方,有兴趣的可以参考对比一下。
via webdesignledger.com  MK 编译

利用ssh穿越防火墙

一群构建防火墙的人的对面,总有一群穿越防火墙的人。构建防火墙的不一定是为了大众的安全,可能是为了花销,可能是为了形象,也可能是为了极权 。另一方面, 穿越防火墙不一定是为了破坏,可能是为了寻求便利,可能是为了技术研究,还有可能是为了敏感词。 这里将利用ssh而且只利用ssh来穿越防火墙 。现以一场景为例来说明如何实现利用ssh来穿越防火墙。


 /-------------------\                /-------------------------\
 | (毛)              |      \    /    | (胡)                    |
 |  /-------------\  |      /    \    |     /--------------\    |
 |  |192.168.9.61 |  |      \ 防 /    |     |192.168.101.33|    |
 |  |   ( 甲 )    |  |      /    \    |     |    ( 子 )    |    |
 |  \-------------/  |      \    /    |     \--------------/    |
 |         ^         |      /    \    |             ^           |
 |         |         |      \    /    |             |           |
 |         |         |======/ 火 \====|             |           |
 |         |         |      \    /    |             |           |
 |         |         |      /    \    |             |           |
 |         v         |      \    /    |             v           |
 |  /-------------\  |      /    \    |     /--------------\    |
 |  |192.168.9.60 |  |      \ 墙 /    |     |192.168.101.34|    |
 |  |   ( 乙 )    |  |      /    \    |     |    ( 丑 )    |    |
 |  \-------------/  |      \    /    |     \--------------/    |
 |                   |      /    \    |                         |
 |                   |      \    /    |                         |
 \-------------------/                \-------------------------/

                       允许ssh的22端口
                    ----->>-(tcp port 22 )->---

                            禁止访问
                    ----------x<---------------

如上场景,两个网络分别是“毛“和“胡”, 网络毛和网络胡之间有堵防火墙作为安全限制。网络毛里的网络节点可以通过ssh访问网络胡里的网络节点,也就是防火墙对网络毛开放了网络胡的tcp 22号端口。反过来,网络胡里的网络节点是完全不能访问网络毛的。现在要解决的问题就是为了穿越之间的防火墙让网络胡能够访问网络毛。

  • 在网络毛的一个节点″子”上,构建到网络胡一节点″甲″的一条能反向的ssh隧道。

    ssh -N -R 2222:localhost:22 甲的用户@甲

  • 在甲上利用上一步创建的网络隧道创建一个到子的socks代理。

    ssh -N -D 8080 -p 2222 甲的用户@localhost

  • 这样就能利用节点子的socks代理(甲的8080端口)就能访问网络毛的网络节点,前提是节点子能访问自己网络里的其它节点。在节点甲测试如下:

    curl –socks localhost:8080 http://192.168.9.60

ssh是一个强大的工具,以上可见一斑。 以上的这种方式,应该还可以简化 ,等在实践中再完善吧,特此抛砖引玉。

CDN缓存策略FAQ

1.CDN加速原理
通过动态域名解析,网友的请求被分配到离自己最快的服务器。CDN服务器直接返回缓存文件或通过专线代理原站的内容。
网络加速+内容缓存,有效提供访问速度

2.CDN节点数量
全国多个机房,每个机房多台服务器,CDN节点一般上百台

3.CDN缓存什么内容
缓存html、图片、css、xml等静态资源,不缓存含有?的动态地址、jsp、php,js文件也不缓存【除非特殊设置】
缓存原站返回HTTP状态为20*或304,不缓存其他状态(例如404,500,503)

4.CDN缓存内容的更新
a)用户首次请求,CDN从原站抓取后缓存,直到文件过期后有用户请求再次更新
b)程序主动通知CDN抓取

5.CDN缓存内容的有效期
a)原站apache吐出的静态文件:由apache的expire和header模块控制
主要两项:last-modified,cache-control:max-age
apache缺省配置,所有静态文件在cdn只缓存3600s【需要我们按需求调整被加速服务器的apache设置】
3600s后cdn失效,用户访问时会重新请求原站,如果没有变化,缓存失效周期自动延长10%。
b)原站jsp或php吐出的动态内容(url形式必须是静态的)
由程序控制last-modified,cache-control:max-age public ,apache的设置将不起作用
cdn根据这两项判断是否需要到原站更新内容

6.CDN和应用的结合策略
a)变化不频繁的页面:例如图吧的图片显示页、车型页、已结束的比赛对阵页
在原站生成静态页面,原站apache上定义过期时间,例如1天。
原站上静态文件更新后,可以等待cdn过期。或者主动通知cdn更新(随着cdn节点越来越多,代价会非常高)
b)变化频繁的页面:例如足球库中的及时亚盘、及时欧赔、正在进行的比赛对阵页
不生成静态页面,由jsp或php定义过期时间,例如5s或60s。cdn过期后,如果有用户访问就从原站上抓取。
优点:相关页面内容更新后,不需要主动通知100个原站都来抓取,有效降低原站的压力。
如果页面内容没有变化,返回lastmodified不变,这样原站会直接返回304给cdn,cdn也会返回304给用户。减少网络传输和速度
比赛结束后,“正在进行的比赛对阵页”转换为第一类情况,再生成静态文件
c)特殊静态资源:例如图片库和某些大型产品库中的评论js
或者频繁访问、频繁更新的页面:例如足球赛事库的及时比分文件
通过apache nocache告诉IE不缓存,html中就不需要使用pinglun.js?123456这样的代码形式
然后用max-age告诉cdn缓存1s,这样避免每次用户请求都转到原站

转自:http://www.71j.cn/archives/10

Web设计中的苹果风(非原创)

优雅的设计贯穿苹果所有的产品,也包括网站,不仅苹果自己的网站,世界上有无数模仿苹果的网站设计,然而是什么构成了苹果式网站设计风格?浅淡的配色,大面积留白,清晰统一的导航,雅致的图标,还有,拒绝使用Flash,本文分析了Web设计中苹果风的构成元素,并提供了大量苹果风Web设计案例供大家欣赏。

浅色系与微妙的渐变色

留白,留白

清晰明快的字体

产品图片充满美感

雅致的图标

干净整洁的网格布局

清晰,友好,一致的导航

小而清晰的字体

简洁的指南

Apple Store

Apple Mac

简单就是美

漂亮的图标贯串始终,对内容的组织很有效

非常漂亮的产品图片

Acrylic Apps

深得苹果精髓的设计,大产品图 + 灰白蓝色系 + 大小对比强烈的字体

杜工在windows下定时备份mysql的脚本

嘿嘿,大家是不是经常为找不到windows下的定时备份脚本而苦恼(哭闹?),这里杜工分享下bat脚本做自动备份的例子,使用前请先安装WinRAR。

rem
rem C:\Program Files (x86)\WinRAR 需要配置到系统环境变量 path 下,才能调用rar cli工具
rem
rem 跳转到工作目录下
e:
cd e:\DBBAK
rem 设置备份文件名
SET BAK_FILE=MY_DBBAK_%DATE:~0,-4%.SQL
rem 设置日志文件名
SET LOG_FILE=MY_DBBAK.log
rem 记录日志
echo "%date%" >> %LOG_FILE%
rem 开始dump
mysqldump --default-character-set=utf8 -hlocalhost -uroot -R --triggers --single-transaction -B mydb > %BAK_FILE%
rem 压缩备份文件
rar a %BAK_FILE%.rar %BAK_FILE%
rem 删除临时文件
del /F %BAK_FILE%
echo "%date%" >> %LOG_FILE%
echo "" >> %LOG_FILE%

Web应用的成功之路 – 产品早期的原型设计与用户测试

最近一阵有些难以抑制的脑痒手痒,阅读和码字的欲望也渐增;却受时间精力等绝对客观因素所限,不得不维系一周一篇译文的频率,感觉多少有那么点沮丧和无奈。

关于本文,其实在标题上犹豫了蛮久。这篇内容是新书A Practical Guide to Web App Success的第15章;主题显然应该在Web应用方面,但是本章单独拎出来看的话,却又适用于各种常见类型的Web产品。whatever,不矛盾。作者Dan Zambonini在本文中将向我们阐述Web应用在原型阶段的设计与测试工作的重要性,并从实际执行的角度出发,介绍一些经验方法和常用工具。走着。

产品在原型阶段的设计与测试工作,是决定一款移动应用能否成功的重要因素。提到原型设计和用户测试,人们往往容易产生厌倦与回避的感觉。这也不奇怪,在很多实际项目中,这方面的工作似乎就是“随意性强”,“耗时”,“高成本”一类的代名词。 Continue reading

a romantic wedding vow

Guys, to be honest, it is almost to kill me to figure out what kind of article I can share with all of you this week after we all be reminded by DuYiPeng that each of us should upload at least one, otherwise buy dinner for other.

At last, I finally realize that why not sharing some kind of amazing article or dialog or even lines in my favorite , you know, television series to enhance our ability of English. For such reason, I pick the romantic wedding vows in <<Friends>>to share.

The following is the vow of Monica&Chandle’s Wedding, while it touch me deeply, and I absolutely recommend all of us, especially TaoFaHui SunPengFei ,try to repeat it for your coming romantic moment.

Here is it

Monica: Chandler, for so long, I wondered if I would ever find my prince, my soul mate. Then three years ago, at another wedding, I turned to a friend for comfort, and instead, I found everything that I’d been looking for my whole life.

And now, here we are, with our future before us and I only want to spend it with you.

My prince, my soul mate, my friend.

 

Chandler: Monica, I thought this was going to be the most difficult thing I ever gonna had to do. But when I saw you walking down that aisle I realized how simple it was. I love you. Any surprises that come our way it’s okay, because I will always love you.

You are the person I was meant to spend the rest of my life with.

You wanna know if I’m sure?

下面是他们婚礼誓言的翻译,大家可以参考下

莫妮卡:

钱德勒,从小…我就在想, 我能不能找到我的白马王子, 我的灵魂伴侣。三年前,在另一场婚礼,我向朋友寻求安慰,结果我找到了我一直在找的一切。

现在, 我们在这里,一起迎接未来。

我只想跟你在一起,我的白马王子, 我的灵魂伴侣, 我的朋友。

钱德勒:

莫妮卡, 我以为这是我必须做的最困难的事。

但当我看到你走过红地毯时,我了解到它真的很简单。我爱你,无论出现什么样的惊喜都没关系。因为我会永远爱你。我注定要跟你共度余生

你想知道我确不确定吗?

Activity 中获取所有控件 并设置自定义字体

最近我在面试Android工程师的时候出过一个题目:怎么获取当前Activity中的所有控件,基本大多数人茫然了,不知道怎么去做。可能是我出的题目有些操蛋吧。我把我的代码贴出来,大家打击批评吧。

 

…..

 

public class MyActivity extends Activity {

……

//获取当前Activity里所有控件

 

 

public List<View> getAllChildViews() {
View view = this.getWindow().getDecorView();
return getAllChildViews(view);
}
//获取指定View里所有控件
public List<View> getAllChildViews(View view) {
List<View> allchildren = new ArrayList<View>();
if (view instanceof ViewGroup) {
ViewGroup vp = (ViewGroup) view;
for (int i = 0; i < vp.getChildCount(); i++) {
View viewchild = vp.getChildAt(i);
allchildren.add(viewchild);
allchildren.addAll(getAllChildViews(viewchild));
}
}
return allchildren;
}

}

 

 

当然,这代码也是有问题的,就是无法得到ListView这类控件的所有Item,应为ListView不是继承ViewGroup ,这是个鸡肋方法,很少用,如果大家有兴趣的话,可以帮忙改进写。

得到当前Activity里的所有控件,有什么用呢,我主要是为了给当前Activity设置自定义字体。

 

    private void setTypeface(Typeface typeface) {
List<View> children = getAllChildViews();
for (View child : children) {
if (child instanceof TextView) {
TextView tv = (TextView) child;
tv.setTypeface(typeface);
}
}
}

如果有人有更好的解决方案,不妨分享写。