织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>杂项技术>.NET(C#)>

智能手机程序在线更新

落鹤生 发布于 2010-09-03 21:39 点击:次 
最近刚完成一个在线更新的东西。因为智能手机应用没有Clickonce之类的更新程序,所以自己动手写一个。(其实clickonce也并不好用,自己动手写一个更方便).更新程序后台用webservice,httphandler都行,这里不多讲,主要讲讲前台设计。
TAG:

最近刚完成一个在线更新的东西。因为智能手机应用没有Clickonce之类的更新程序,所以自己动手写一个。(其实clickonce也并不好用,自己动手写一个更方便).更新程序后台用webservice,httphandler都行,这里不多讲,主要讲讲前台设计。
更新程序分为4个步骤:

1.下载服务器版本及更新列表,对比本地的版本,是否需要更新;
2.下载服务器的更新版本;
3.覆盖本地版本;
4.重新启动主应用程序;

如果用传统的设计,4个步骤很简单,定义一个枚举分别对应每个步骤;

  1. /// <summary> 
  2.     /// 系统自动升级步骤 
  3.     /// </summary> 
  4.     public enum AutoUpdateStep 
  5.     { 
  6.         /// <summary> 
  7.         /// 正在获取服务器版本 
  8.         /// </summary> 
  9.         SeeingServerEdition = 1, 
  10.         /// <summary> 
  11.         /// 正在下载服务器端文件 
  12.         /// </summary> 
  13.         DownLoadingServerFiles = 2, 
  14.         /// <summary> 
  15.         /// 服务器文件保存完毕 
  16.         /// </summary> 
  17.         ServerFilesDownloaded = 3, 
  18.         /// <summary> 
  19.         /// 更新完毕 
  20.         /// </summary> 
  21.         Finished = 4, 
  22.         /// <summary> 
  23.         /// 未知状态 
  24.         /// </summary> 
  25.         Unknow = 0 

然后if…else…判断步骤,执行相应的步骤。但是这样如果想在中间插入一个步骤,都会很麻烦。考虑过后,如果引入命令模式,则很方便的实现各个步骤。
定义各个步骤的基类:

  1. public abstract class UpdateCommand 
  2. protected Context _context; 
  3. public UpdateCommand(Context context) 
  4. this._context = context; 
  5.  
  6. #region abstract Method 
  7. public abstract void Execute(); 
  8. #endregion 

获取服务端版本及更新列表:

  1. public class GetServerVersionCommand : UpdateCommand 
  2. public GetServerVersionCommand(Context context) 
  3. base(context) 
  4.  
  5. public override void Execute() 
  6.  //实现略…… 

下载服务端新版本:

  1. public class DownloadDataCommand : UpdateCommand 
  2. public DownloadDataCommand(Context context) 
  3. base(context) 
  4.  
  5. public override void Execute() 
  6. //实现略…… 

其它2个步骤,更新本地版本,完成更新重启主程序类似,SaveDownloadDataCommand,FinishDownloadCommand。

Context 是用来和主界面交互的中间层,有点中介者的味道,主要定义了一系列事件,用于实现和主界面的交互。这样可以实现主界面与各个命令的解藕。

  1. public sealed class SmartUpdateManager   
  2. #region Properties 
  3. private List<UpdateCommand> Commands = null
  4. private int Index = 0; 
  5. private Context _context = null
  6. public Context UpdateContext 
  7. get 
  8. if (this._context == null
  9. _context = new Context(); 
  10. return this._context; 
  11.   
  12. #endregion 
  13. public SmartUpdateManager() 
  14. InitHandleUpdate(); 
  15.   
  16. private void InitHandleUpdate() 
  17. Commands = new List<UpdateCommand>(); 
  18. GetServerVersionCommand cmd1 = new GetServerVersionCommand(UpdateContext); 
  19. DownloadDataCommand cmd2 = new DownloadDataCommand(UpdateContext); 
  20. SaveDownloadDataCommand cmd3 = new SaveDownloadDataCommand(UpdateContext); 
  21. FinishDownloadCommand cmd4 = new FinishDownloadCommand(UpdateContext); 
  22.   
  23. Commands.Add(cmd1); 
  24. Commands.Add(cmd2); 
  25. Commands.Add(cmd3); 
  26. Commands.Add(cmd4); 
  27.   
  28. #region Public Method 
  29. public void Execute() 
  30.   InnerHandExecute(); 
  31.   
  32. private void InnerHandExecute() 
  33. try 
  34.  if (this.Index < this.Commands.Count) 
  35. this.Commands[this.Index].Execute(); 
  36. this.Index++; 
  37. catch (Exception) 
  38. #endregion 
  39.   

客户界面调用,很方便,主界面订阅SmartUpdateManager中Context的事件用于更新进度条,提示信息等交互信息。

  1. private SmartUpdateManager manager = null
  2. private void InitUpdateManager() 
  3. manager = new SmartUpdateManager(); 
  4. manager.UpdateContext.ApplicationExit +=
  5.  new ApplicationExitHandler(manager_onApplicationExit); 
  6. manager.UpdateContext.EnabledChanged +=
  7.  new EnabledChangedHandler(manager_onEnabledChanged); 
  8. manager.UpdateContext.ProcessBarValueChanged +=
  9.  new ProgressarValueChangedHandler(manager_onProcessBarValueChanged); 
  10. manager.UpdateContext.PromptMsgChanged +=
  11.  new PromptMsgChangedHandler(manager_onPromptMsgChanged); 
  12. manager.UpdateContext.TextChanged +=
  13.  new TextChangedHandler(manager_onTextChanged); 
  14. manager.UpdateContext.VisiableChanged +=
  15.  new VisiableChangedHandler(manager_onVisiableChanged); 
  16. manager.UpdateContext.WorkingTipMessageChanged +=
  17.  new WorkingTipMessageChangedHandler(manager_onWorkingTipMessageChanged); 
  18. manager.UpdateContext.CancelEnableChanged +=
  19.  new CancelEnableChangedHandler(manager_onCancelEnabled); 
  20.   
  21. void btnNext_Click(object sender, EventArgs e) 
  22. try 
  23. this.psbDownload.Value = 0; 
  24. this.btnNext.Enabled = false
  25. this.manager.Execute(); 
  26. //Application.DoEvents(); 
  27. catch (Exception) 
  28. //……… 

这样的设计很容易实现向导,实际上我实现的就是向导式的更新。一步一步提示用户。如果想在中间增加一个环节,比如增加一个欢迎环节,一个校对文件的环节。那么我们只需要更改SmartUpdateManager中的代码。我们新增2个WelComeCommand, ValidateCommand.

  1. private void InitHandleUpdate() 
  2. Commands = new List<UpdateCommand>(); 
  3. //_context = new Context(); 
  4.   
  5. GetServerVersionCommand cmd1 = new GetServerVersionCommand(UpdateContext); 
  6. DownloadDataCommand cmd2 = new DownloadDataCommand(UpdateContext); 
  7. SaveDownloadDataCommand cmd3 = new SaveDownloadDataCommand(UpdateContext); 
  8. FinishDownloadCommand cmd4 = new FinishDownloadCommand(UpdateContext); 
  9.   
  10. //注意这是新增的环节,欢迎环节。 
  11. WelComeCommand cmdNew1 = new WelComeCommand(UpdateContext); 
  12. //插入另一个新环节,校对下载的文件。。。。 
  13. ValidateCommand cmdNew2 = new ValidateCommand(UpdateContext); 
  14.   
  15. Commands.Add(cmdNew1);  //插到第一个环节; 
  16. Commands.Add(cmd1); 
  17. Commands.Add(cmd2); 
  18. Commands.Add(cmdNew2);  //插入另一个环节,校对文件环节。 
  19. Commands.Add(cmd3); 
  20. Commands.Add(cmd4); 

这样的需求变更,客户端的调用不需要任何改动。

(michael-zhangyu)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10087.html]
本文出处:博客园 作者:michael-zhangyu
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容