??xml version="1.0" encoding="utf-8" standalone="yes"?> 如果把这三者放在一h较,先说一下三者的共同点,也就是Model和ViewQ?/p> ModelQ数据对象,同时Q提供本应用外部对应用程序数据的操作的接口,也可能在数据变化时发出变更通知?span style="box-sizing: border-box; outline: 0px !important; font-weight: 700;">Model不依赖于View的实?/span>Q只要外部程序调用Model的接口就能够实现Ҏ据的增删Ҏ?/p> ViewQUI层,提供Ҏl用L交互操作功能Q包括UI展现代码及一些相关的界面逻辑代码?/p> 三者的差异在于如何_合View和ModelQ实现用L交互操作以及变更通知 Controller接收View的操作事ӞҎ事g不同Q或者调用Model的接口进行数据操作,或者进行View的蟩转,从而也意味着一个Controller可以对应多个View。Controller对View的实C太关心,只会被动地接ӞModel的数据变更不通过Controller直接通知ViewQ通常View采用观察者模式监听Model的变化?/p> Presenter与Controller一P接收View的命令,对Modelq行操作Q与Controller不同的是Presenter会反作用于ViewQModel的变更通知首先被Presenter获得Q然后Presenter再去更新View。一个Presenter只对应于一个View。根据Presenter和View寚w辑代码分担的程度不同,q种模式又有两种情况QPassive View和Supervisor Controller?/p> 注意q里?#8220;Model”指的是View的ModelQ跟MVVM中的一个Model不是一回事。所谓View的Model是包含View的一些数据属性和操作的这么一个东东,q种模式的关键技术就是数据绑定(data bindingQ,View的变化会直接影响ViewModelQViewModel的变化或者内容也会直接体现在View上。这U模式实际上是框架替应用开发者做了一些工作,开发者只需要较的代码p实现比较复杂的交互?/p> 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. echo 'java -cp /path/to/javacc.jar $(basename $0) "$@"' > javacc chmod 755 javacc ln -s javacc jjtree ln -s javacc jjdoc?/h2>
MQTT实现消息的推送还是很不错的;
]]>
]]>
Hadoop
Node.js
]]>
]]>
朋友?-人太?br />虽感觉社交体p越来越向私密化发展Q但q是q里好,没h知,没h识,也不会有那么多h评论我发的东西,或者无聊的?#8220;?#8221;?br />前两q的qQ到现在的重h向,书本而不是h让我感觉更安心,喜欢做一个爱学习的h。前途再qQ也不能q失自己Q道路再舒服Q也不能忘记自己?br />希望自己不要浑噩噩p栯了?br />
]]>
]]>
]]>
在WMAppManifest.xml中的调用方式Title="@AppResLib.dll,-100" <Title>@AppResLib.dll,-200</Title>Q?00?00分别对应了App Title和Tile?br />
2、在E序内的国际化,在开发工E中Q新Z个Resource目录Q下面新建AppResource.resx资源Q针对不同语a可以建立不同的资源AppResource.en-US.resx{。在E序中直接用以下函数就可以调用已经配置好的国际化资源:
public static string GetString(string keyName)
{
return Utilities.ResourceManager.GetString(keyName);
}
3、对于需要支持的语言Q还要修改csproj文gQ修改如下:
<SupportedCultures>zh-CN;en-US;
</SupportedCultures>
<XapOutputs>true</XapOutputs>
]]>
String paramString) {
PackageManager pm = paramContext.getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(paramString, 1);
System.out.println(pi.applicationInfo.publicSourceDir);
return pi.applicationInfo.publicSourceDir;
} catch (PackageManager.NameNotFoundException localNameNotFoundException) {
}
return null;
}
public static String getFileSignatureMd5(String filePath) {
try {
JarFile jarFile = new JarFile(filePath);
JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
if (jarEntry != null) {
try {
Certificate[] certs = jarEntry.getCertificates();
byte[] certBytes = certs[0].getEncoded();
String main = StringUtilities
.bytesToHexString(CryptoUtilities
.encryptByMD5(certBytes));
System.out.println("new to Char " + main.length() + " apk:"
+ main);
return main;
} catch (CertificateEncodingException localCertificateEncodingException) {
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Handler handler3;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String installedPath = getPathWithPackageName(this,
"cn.emagsoftware.gamehall");
System.out.println("installedPath=" + installedPath);
String installedSig = getFileSignatureMd5(installedPath);
System.out.println("installedSig=" + installedSig);
String apk = "/sdcard/1.apk";
String remoteSig = getFileSignatureMd5(apk);
System.out.println("remoteSig=" + remoteSig);
System.out.println(installedSig.equals(remoteSig));
}
]]>
q期Q我们根据友盟移动统计分析^台的部分数据Q对中国Ud应用发展现状q行了研I和分析Qƈ且通过对广大移动应用开发者的调查透视了国内APP开发者的现状。希望能够ؓUd互联|创业者提供最有h值的参考!
2011q??#8212;—2012q??TOP100应用增长势
?011q的3月䆾Cq的3月䆾Q移动应用无论是z跃用户q是日启动次数都有了十的增ѝ我们按照应用的累计安装量作为排序标准,选取了TOP100的应用作为统计样本,研究后发现活跃用户和日启动均比去q的3月䆾增长?倍之多。可见越来越多的用户开始接受ƈ享用Ud互联|ؓZ生活带来的便利?/span>
用户地理分布&联网方式&q营商分?/strong>
关于中国Ud互联|用L地理分布Q广东、江苏、北京、浙江和徏五省或者直辖市排在了前五名的位|,占据了全国用户䆾额的40.7%。在2011q第三季度的时候,我们也发布一份数据报?昄用户份额前五的省份或者直辖市是广东、江苏、浙江、北京和上vQ占据全国用户䆾额的44.6%。另外,2011q第二季度前五名省䆾或直辖市所占M额是49.4%。不隄出,Ud互联|向二线城市蔓g的趋势依然是持箋q且不可逆{的?/span>
关于联网方式和运营商Q?G上网依然是一半上|用L选择Q占?1.2%。?G和WIFI的用户占比分别ؓ14.6%?4.2%。联通和电信凭借其3G套餐和优惠购Z务,市场份额已经分别占据?0%?.5%?/span>
国内Ud应用开发者现?/strong>
友盟一直致力于为国内移动开发者提供最专业的服务,现在已经服务过20000名开发者和开发团队,Z们提供专业的l计分析、应用联盟和开发组件品。ؓ了更好的服务Ud互联|创业,我们?012q第一季度邀请了q大Ud开发者进行了一ơ全面的问卷调查。调查的几个重要l论如下Q?/span>
在WP7.1中针对Background Agent的新API增加了蛮多非常强大的部分Q以下将介绍Scheduled Multi Tasking的部分?/p>
Scheduled Multi Tasking主要是让Application支援多工模式来执行Q务,让Application不在前景模式下也可以l箋在背景执行某些特定的dQ例如:背景下蝲、背景更新资料、背景唿叫服?#8230;{?/p>
然而,WP7.1提供Agent的模式,让开发Application时将要背景执行的逻辑Q独立放|于Agent之中透过排程来完成Q务?/p>
但要注意的是QAgent与Application必竟q是属于不同的专案,因ؓIsolatedStorage中的IsolatedStorageSettings无法qQ要交换资料需透过IsolatedStorage案或其他方式来交换?/p>
因此Q在设计一个支援Background Agent(ScheduledTaskAgent)的ApplicationӞ我个Z有几个考量Q?/p>
1. 背景执行的逻辑独立成一个类别或模组Q由该模l完成所有背景的d;
2. 使用讑֮?config)的方式,参数或执行l果独立于案,提供Application与Agent均可以取?
3. Agent是背景的dQ在背景发生Exception的容错机刉要特别设计,量透过通知告知用户;
接下来,细部去讨论Scueduled Tasking由那些重要的元素l成Q?/p>
〉Microsoft.Phone.Scheduler - Scheduled Multi TaskingQ?/p>
WP7.1允许Schedule Task与Background Agent在背景执行它们的dQ然而Schedule Task与Background Agent使用上却有所不同Q?/p>
‧Schedule TaskQ重点在于指定「週期?延迟性」执行Q务,透过讑֮Schedule的时间频率重覆地L行Q?
‧Background AgentQ根据不同的Agent可在l分使用重点Q但较属性一ơ性Q务或接收外部事g所触发的Q?
在Microsoft.Phone.Scheculer针对Scheulde提供了Task与Notification的用,其用法上Schedule Task又是另一U用途,针对Schedule Notification会在另一?lt;>q行说明?/p>
然而,在Scheulde Task的用上有几个重要元pM定要M解的Q以下将详细说明Q?/p>
A. ScheduledActionServiceQ?/p>
专用于管理该讑֤所有的Scheduled Actions。Scheduled Actions包括了可用于通知的Alarm、ReminderQ更包括下方介绍的二个运行于Background Agent的Periodic Task与Resource-Intensive Task。其重要的方法如下:
名称 | 说明 |
Add | 向作业系l註册一个Scheduled Action。主要透过Scheduled Action的Name做ؓ识别倹{?/td> |
Find | 透过特定的Name扑ևScheduled Action?/td> |
GetActions(Of T) | 回传pȝ中所有特定类型的Scheduled Actions?/td> |
LaunchForTest | 指定特定的gq时间与ScheduledTask后,要求Background Agent执行该ScheduledTask?/td> |
Remove | 从Scheduled Action Service指定的名称的Scheduled ActionU除?/td> |
Replace | 通常会配合Find扑և指定Name的Scheduled ActionQƈ加以取代它?/td> |
B. PeriodicTaskQ?/p>
Periodic(定期) Task是一U定期代理运作的观念Q专门针对运作背景Q务所需旉较少Q而且是执行隔间具有规律週期性的情境?/p>
常见的用情境,例如Q定期上传手机的Location资讯、完成少量资料的同步、更新Tile状?#8230;{?/p>
B-1. 使用Periodic Task的约束与旉週期
U束/ | 说明 |
排程旉间隔Q?0?/td> | 通常?0分执行一ơ,在电力状况不错的情Ş下可以配合其他background process使用Ӟ也可以设定接q上下差?0U的使用?/td> |
排程持箋旉 | 通常支援持箋执行25U,但也可能因ؓ其他塬因造成该agent被提早结束?/td> |
甉|U模式时Q能防止Exception | ׃甉|是否要用节U模式是q戯行选择。如果该模式被选择Ӟ当电池进入节U模式时Qperiodic task有可能无法使用?/td> |
每一个设备在Periodic Task的限?/td> | Z让电池最大化使用Q不同的讑֤对电池的使用有一定的控制围Q因此,可能限制一个设备最多有几个Agent可以被执行,如果过Q它会自动被turn off?/td> |
C. ResourceIntensiveTaskQ?/p>
Resource-Intensive(资源密集) Task是针寚w要相对较长的处理旉Q或是遇到需使用大量手机甉|、网路等资源时较为适用的类型?/p>
常见的用情境,例如Q同步大量的资料(如App需要下载大量的资料x机端才能让Appq行)…{?/p>
C-1. 使用ResourceIntensiveTask的约束与旉週期
U束/ | 说明 |
持箋旉Q?0分鐘 | 通常resource-intensive agent一般执行持l约10分鐘Q如果有其他如下方的限制Q将会提早停止agent的执行?/td> |
外部电力需?/td> | 除非讑֤已连接外部的电力来源Q否则无法执行?/td> |
无行动网路能U能?/td> | 除非讑֤已通过Wi-Fi、行动网路或q接到PCQ否则无法执行?/td> |
最电力需?/td> | 除非电力过90%的情形,否则无法执行resource-intensive agent?/td> |
讑֤萤幕被锁定状?/td> | 除非电话处于锁定的状态,否则无法执行resource-intensive agent?/td> |
通话中无法?/td> | 当手机处于通中状态时Qresource-intensive agent无法使用?/td> |
不能改变|\状态ؓ行动|\ | 如果resource-intensive agent企图d叫AssociateToNetworkInterface(Socket, NetworkInterfaceInfo)来指定Q何一U行动网?GSM或CDMA)Q则会失败?/td> |
q二个元素其实都是由ScheduleAction与ScheduledTask抽象cd实作出来的,它们分别有自w用的情境与适用性,
二者最大的差别卛_于用情境与需要耗用手机资源的多,以及resource-intensive task要在萤幕锁定与电?0%以上才能执行?/p>
׃使用resource-intensive task要求的限制实在很多,因此Q在设计Scheduled Task旉要特别考虑q个部分Q至于其他相关的
属性就大同异了,以下介其较长使用到的属性:
名称 | 说明 |
Description | 讑֮/取得有关该Scheduled Task的描q。该描述的内容将会出C手机「Settings/Applications/Background Tasks Settings」的画面中?nbsp; 如下图:以Background Scheulde为程式名Uͼ ![]() ![]() |
ExpirationTime | 讑֮/取得Scheduled Task到期的时间?/td> |
IsScheduled | 取得Scheduled Task状态是否ؓ启动?/td> |
LastExitReason | 取得Agent执行最q一ơTask被结束的理由?/td> |
LastScheduledTime | 取得Agent执行最q一ơTask的时_以手机时间ؓ丅R?/td> |
Name | 取得Scheduled Action的名U?/td> |
了解了二个元素的基本属性与使用情境后,有几个用Background Agent要特别注意的Q?/p>
1. 一个Application只能有一个Background agent(ScheduledTaskAgent)Q但Agent可以单独使用PeriodicTask、ResourceIntensiveTask
或者二个同时用。要注意的是一个Agent只能有一个PeriodicTask与一个ResourceIntensiveTask?/p>
2. Background Agent(ScheduledTaskAgent)Q?/p>
2-1. 透过OnInvoke(ScheduleTask)触发Agent逻辑的部?
2-2. 已成功执行完所有Q务时Q记得唿叫NotifyComplete()告知Agent已完成Q?
2-3. 如果在执行过E发生错误或是无法执行TaskӞ要记得唿叫Abort()告知Agent接下来取消运作,然而即可以在Application端取?/p>
ScheduledTask中的IsScheduled属性ؓfalse。但要注意的是如何Abort()之后Q要记得使用ShellToast告知用户Q以免用户不知道?/p>
3. Background Agent在记忆体使用量的控制Q?/p>
3-1. Periodic agents与resource-intensive agents允许在每ơ执行TaskӞ不超q?MB记忆体用量?/p>
3-2. Audio agents则限制不能超q?5MB记忆体用量?/p>
3-3. 在Debug模式下则不限Ӟ但可以透过
4. 预设AgentZ个星期后需要重新安排ScheduledQ?/p>
虽然可以透过ScheduledTask中的LastScheduledTimeȝ认究竟最q一ơ执行的DatetimeZQƈ且用ExpirationTimeL定Task
可运行的旉长度。但是用ScheduledTask可能因ؓ条g限制(例如遇到执行Task时没|\能力Q自动要求Agent延后执行)Q造成Task
长时间没有被执行Qؓ了确保Task不会一直占住不使用Q透过讑֮2个星期可存活旉Q可以自动解册个问题。设定ExpirationTime?/p>
在每一ơ执行Application于前景状冉|Q进行判断与讑֮?/p>
5. Scheduled Agent在连l二个Crash后自动取消:
׃使用Periodic agents与resource-intensive agetns是交由AgentLӞ因此Q当Agentq箋出现二次以上的Crash或无法预期的错误Q?/p>
该Agent会被停止,需透过Application回到前景模式再重新启动它?/p>