如果把这三者放在一起比较,先说一下三者的共同点,也就是model和view:
model:数据对象,同时,提供本应用外部对应用程序数据的操作的接口,也可能在数据变化时发出变更通知。model不依赖于view的实现,只要外部程序调用model的接口就能够实现对数据的增删改查。
view:ui层,提供对最终用户的交互操作功能,包括ui展现代码及一些相关的界面逻辑代码。
三者的差异在于如何粘合view和model,实现用户的交互操作以及变更通知
controller接收view的操作事件,根据事件不同,或者调用model的接口进行数据操作,或者进行view的跳转,从而也意味着一个controller可以对应多个view。controller对view的实现不太关心,只会被动地接收,model的数据变更不通过controller直接通知view,通常view采用观察者模式监听model的变化。
presenter与controller一样,接收view的命令,对model进行操作;与controller不同的是presenter会反作用于view,model的变更通知首先被presenter获得,然后presenter再去更新view。一个presenter只对应于一个view。根据presenter和view对逻辑代码分担的程度不同,这种模式又有两种情况:passive view和supervisor controller。
注意这里的“model”指的是view的model,跟mvvm中的一个model不是一回事。所谓view的model就是包含view的一些数据属性和操作的这么一个东东,这种模式的关键技术就是数据绑定(data binding),view的变化会直接影响viewmodel,viewmodel的变化或者内容也会直接体现在view上。这种模式实际上是框架替应用开发者做了一些工作,开发者只需要较少的代码就能实现比较复杂的交互。
java compiler compiler tm (javacc tm) is the most popular parser generator for use with java tm applications. a parser generator is a tool that reads a grammar specification and converts it to a java program that can recognize matches to the grammar. in addition to the parser generator itself, javacc provides other standard capabilities related to parser generation such as tree building (via a tool called jjtree included with javacc), actions, debugging, etc.
下载后的使用方式(mac&linux):echo 'java -cp /path/to/javacc.jar $(basename $0) "$@"' > javacc
chmod 755 javacc
ln -s javacc jjtree
ln -s javacc jjdoc
近期,我们根据友盟移动统计分析平台的部分数据,对中国移动应用发展现状进行了研究和分析,并且通过对广大移动应用开发者的调查透视了国内app开发者的现状。希望能够为移动互联网创业者提供最有价值的参考!
2011年3月——2012年3月 top100应用增长趋势
从2011年的3月份到今年的3月份,移动应用无论是活跃用户还是日启动次数都有了十足的增长。我们按照应用的累计安装量作为排序标准,选取了top100的应用作为统计样本,研究后发现活跃用户和日启动均比去年的3月份增长了5倍之多。可见越来越多的用户开始接受并享用移动互联网为人们生活带来的便利。
用户地理分布&联网方式&运营商分布
关于中国移动互联网用户的地理分布,广东、江苏、北京、浙江和福建五省或者直辖市排在了前五名的位置,占据了全国用户份额的40.7%。在2011年第三季度的时候,我们也发布一份数据报告,显示用户份额前五的省份或者直辖市是广东、江苏、浙江、北京和上海,占据全国用户份额的44.6%。另外,2011年第二季度前五名省份或直辖市所占总份额是49.4%。不难看出,移动互联网向二线城市蔓延的趋势依然是持续并且不可逆转的。
关于联网方式和运营商,2g上网依然是一半上网用户的选择,占比51.2%。使用3g和wifi的用户占比分别为14.6%和34.2%。联通和电信凭借其3g套餐和优惠购机业务,市场份额已经分别占据了20%和9.5%。
国内移动应用开发者现状
友盟一直致力于为国内移动开发者提供最专业的服务,现在已经服务超过20000名开发者和开发团队,为他们提供专业的统计分析、应用联盟和开发组件产品。为了更好的服务移动互联网创业,我们在2012年第一季度邀请了广大移动开发者进行了一次全面的问卷调查。调查的几个重要结论如下:
在wp7.1中针对background agent的新api增加了蛮多非常强大的部分,以下将介绍scheduled multi tasking的部分。
scheduled multi tasking主要是让application支援多工模式来执行任务,让application不在前景模式下也可以继续在背景执行某些特定的任务,例如:背景下载、背景更新资料、背景唿叫服务…等。
然而,wp7.1提供agent的模式,让开发application时将要背景执行的逻辑,独立放置于agent之中透过排程来完成任务。
但要注意的是,agent与application必竟还是属于不同的专案,因为isolatedstorage中的isolatedstoragesettings无法共用,要交换资料需透过isolatedstorage档案或其他方式来交换。
因此,在设计一个支援background agent(scheduledtaskagent)的application时,我个人会有几个考量:
1. 将背景执行的逻辑独立成一个类别或模组,由该模组完成所有背景的任务;
2. 使用设定档(config)的方式,将参数或执行结果独立于档案,提供application与agent均可以取得;
3. agent是背景的任务,在背景发生exception的容错机制需要特别设计,尽量透过通知告知用户;
接下来,将细部去讨论scueduled tasking由那些重要的元素组成:
〉microsoft.phone.scheduler - scheduled multi tasking:
wp7.1允许schedule task与background agent在背景执行它们的任务,然而schedule task与background agent使用上却有所不同:
‧schedule task:重点在于指定「週期性/延迟性」执行任务,透过设定schedule的时间频率重覆地去执行任务;
‧background agent:根据不同的agent可在细分使用重点,但较属性一次性任务或接收外部事件所触发的任务;
在microsoft.phone.scheculer针对scheulde提供了task与notification的使用,其用法上schedule task又是另一种用途,针对schedule notification会在另一篇<>进行说明。
然而,在scheulde task的使用上有几个重要元系一定要去了解的,以下将详细说明:
a. scheduledactionservice:
专用于管理该设备所有的scheduled actions。scheduled actions包括了可用于通知的alarm、reminder,更包括下方介绍的二个运行于background agent的periodic task与resource-intensive task。其重要的方法如下:
名称 | 说明 |
add | 向作业系统註册一个scheduled action。主要透过scheduled action的name做为识别值。 |
find | 透过特定的name找出scheduled action。 |
getactions(of t) | 回传系统中所有特定类型的scheduled actions。 |
launchfortest | 指定特定的延迟时间与scheduledtask后,要求background agent执行该scheduledtask。 |
remove | 从scheduled action service将指定的名称的scheduled action移除。 |
replace | 通常会配合find找出指定name的scheduled action,并加以取代它。 |
b. periodictask:
periodic(定期) task是一种定期代理运作的观念,专门针对运作背景任务所需时间较少,而且是执行隔间具有规律週期性的情境。
常见的使用情境,例如:定期上传手机的location资讯、完成少量资料的同步、更新tile状态…等。
b-1. 使用periodic task的约束与时间週期建议
约束/建议 | 说明 |
排程时间间隔:30分 | 通常每30分执行一次,在电力状况不错的情形下可以配合其他background process使用时,也可以设定接近上下差距10秒的使用。 |
排程持续时间 | 通常支援持续执行25秒,但也可能因为其他塬因造成该agent被提早结束。 |
电池为节约模式时,能防止exception | 由于电池是否要使用节约模式是由用户自行选择。如果该模式被选择时,当电池进入节约模式时,periodic task将有可能无法使用。 |
每一个设备在periodic task的限制 | 为了让电池最大化使用,不同的设备对电池的使用有一定的控制範围,因此,可能限制一个设备最多有几个agent可以被执行,如果超过,它会自动被turn off。 |
c. resourceintensivetask:
resource-intensive(资源密集) task是针对需要相对较长的处理时间,或是遇到需使用大量手机电源、网路等资源时较为适用的类型。
常见的使用情境,例如:同步大量的资料(如app需要下载大量的资料至手机端才能让app运行)…等。
c-1. 使用resourceintensivetask的约束与时间週期建议
约束/建议 | 说明 |
持续时间:10分鐘 | 通常resource-intensive agent一般执行持续约10分鐘,如果有其他如下方的限制,将会提早停止agent的执行。 |
外部电力需求 | 除非设备已连接外部的电力来源,否则无法执行。 |
无行动网路能线能力 | 除非设备已通过wi-fi、行动网路或连接到pc,否则无法执行。 |
最小电力需求 | 除非电力超过90%的情形,否则无法执行resource-intensive agent。 |
设备萤幕被锁定状态 | 除非电话处于锁定的状态,否则无法执行resource-intensive agent。 |
通话中无法使用 | 当手机处于通中状态时,resource-intensive agent无法使用。 |
不能改变网路状态为行动网路 | 如果resource-intensive agent企图去唿叫associatetonetworkinterface(socket, networkinterfaceinfo)来指定任何一种行动网路(gsm或cdma),则会失败。 |
这二个元素其实都是由scheduleaction与scheduledtask抽象类别实作出来的,它们分别有自身使用的情境与适用性,
二者最大的差别即在于使用情境与需要耗用手机资源的多少,以及resource-intensive task要在萤幕锁定与电力90%以上才能执行。
由于使用resource-intensive task要求的限制实在很多,因此,在设计scheduled task时需要特别考虑这个部分,至于其他相关的
属性就大同小异了,以下简介其较长使用到的属性:
名称 | 说明 |
description | 设定/取得有关该scheduled task的描述。该描述的内容将会出现于手机「settings/applications/background tasks settings」的画面中。 如下图:以background scheulde为程式名称: |
expirationtime | 设定/取得scheduled task到期的时间。 |
isscheduled | 取得scheduled task状态是否为启动。 |
lastexitreason | 取得agent执行最近一次task被结束的理由。 |
lastscheduledtime | 取得agent执行最近一次task的时间,以手机时间为主。 |
name | 取得scheduled action的名称。 |
了解了二个元素的基本属性与使用情境后,有几个使用background agent要特别注意的:
1. 一个application只能有一个background agent(scheduledtaskagent),但agent可以单独使用periodictask、resourceintensivetask
或者二个同时使用。要注意的是一个agent只能有一个periodictask与一个resourceintensivetask。
2. background agent(scheduledtaskagent):
2-1. 透过oninvoke(scheduletask)触发agent逻辑的部分;
2-2. 已成功执行完所有任务时,记得唿叫notifycomplete()告知agent已完成任务;
2-3. 如果在执行过程发生错误或是无法执行task时,要记得唿叫abort()告知agent接下来取消运作,然而即可以在application端取得
scheduledtask中的isscheduled属性为false。但要注意的是如何abort()之后,要记得使用shelltoast告知用户,以免用户不知道。
3. background agent在记忆体使用量的控制:
3-1. periodic agents与resource-intensive agents允许在每次执行task时,不超过6mb记忆体用量。
3-2. audio agents则限制不能超过15mb记忆体用量。
3-3. 在debug模式下则不限制,但可以透过
4. 预设agent为二个星期后需要重新安排scheduled:
虽然可以透过scheduledtask中的lastscheduledtime去确认究竟最近一次执行的datetime为何,并且使用expirationtime去指定task
可运行的时间长度。但是使用scheduledtask可能因为条件限制(例如遇到执行task时没网路能力,自动要求agent延后执行),造成task
长时间没有被执行,为了确保task不会一直占住不使用,透过设定2个星期可存活时间,可以自动解决这个问题。设定expirationtime可
在每一次执行application于前景状况时,进行判断与设定。
5. scheduled agent在连续二个crash后自动取消:
由于使用periodic agents与resource-intensive agetns是交由agent去控制,因此,当agent连续出现二次以上的crash或无法预期的错误,
该agent将会被停止,需透过application回到前景模式再重新启动它。