智能手机在线更新程序
发布时间:2020-12-17 02:40:23 所属栏目:安全 来源:网络整理
导读:最近刚完成一个在线更新的东西。因为智能手机应用没有Clickonce之类的更新程序,所以自己动手写一个。(其实clickonce也并不好用,自己 动手写一个更方便).更新程序后台用webservice,httphandler都行,这里不多讲,主要讲讲前台设计。 更新程序分为4个步骤:
最近刚完成一个在线更新的东西。因为智能手机应用没有Clickonce之类的更新程序,所以自己动手写一个。(其实clickonce也并不好用,自己 动手写一个更方便).更新程序后台用webservice,httphandler都行,这里不多讲,主要讲讲前台设计。
更新程序分为4个步骤:
1.下载服务器版本及更新列表,对比本地的版本,是否需要更新;
2.下载服务器的更新版本;
3.覆盖本地版本;
4.重新启动主应用程序;?
如果用传统的设计,4个步骤很简单,定义一个枚举分别对应每个步骤;
///
<summary>
??? ///
系统自动升级步骤
??? ///</summary>
??? public enum AutoUpdateStep
??? {
??????? ///<summary>
??????? ///
正在获取服务器版本
??????? ///</summary>
??????? SeeingServerEdition = 1,
??????? ///<summary>
??????? ///
正在下载服务器端文件
??????? ///</summary>
??????? DownLoadingServerFiles = 2,
??????? ///<summary>
??????? ///
服务器文件保存完毕
??????? ///</summary>
??????? ServerFilesDownloaded = 3,
??????? ///<summary>
??????? ///
更新完毕
??????? ///</summary>
??????? Finished = 4,
??????? ///<summary>
??????? ///
未知状态
??????? ///</summary>
??????? Unknow = 0
}
然后if…else…判断步骤,执行相应的步骤。但是这样如果想在中间插入一个步骤,都会很麻烦。考虑过后,如果引入命令模式,则很方便的实现各个步骤。
定义各个步骤的基类:
public
abstract class UpdateCommand
??? {
??????? protected Context _context;
?
??????? public UpdateCommand(Context context)
??????? {
??????????? this._context = context;
??????? }
?
?????? ?#region
abstract Method
??????? public abstract void Execute();
??????? #endregion
}
?
获取服务端版本及更新列表:
public
class GetServerVersionCommand : UpdateCommand
??? {
??????? public GetServerVersionCommand(Context context)
??????????? : base(context)
??????? {
?
??????? }
?
??????? public override void Execute()
??????? {
????????? ?? //
实现略
……
??????? }
}
?
?
下载服务端新版本:
public
class DownloadDataCommand : UpdateCommand
??? {
??????? public DownloadDataCommand(Context context)
??????????? : base(context)
??????? {
?
???? ???}
?
??????? public override void Execute()
??????? {
??????????? //
实现略
……
??????? }
}
其它
2
个步骤,更新本地版本,完成更新重启主程序类似,
SaveDownloadDataCommand
,
FinishDownloadCommand
。
Context
是用来和主界面交互的中间层,有点中介者的味道,主要定义了一系列事件,用于实现和主界面的交互。这样可以实现主界面与各个命令的解藕。
public
sealed class SmartUpdateManager?
??? {
??????? #region
Properties
??????? private List<UpdateCommand> Commands = null;
??????? private int Index = 0;
?
??????? private Context _context = null;
??????? public Context UpdateContext
??????? {
??????????? get
??????????? {
??????????????? if (this._context == null)
??????????????? {
??????????????????? _context = new Context();
??????????????? }
??????????????? return this._context;
??????????? }
??????? }
?
??????? #endregion
?
??????? public SmartUpdateManager()
??????? {
??????? ??? InitHandleUpdate();
??????? }
?
??????? private void InitHandleUpdate()
??????? {
??????????? Commands = new List<UpdateCommand>();
??????????? GetServerVersionCommand cmd1 = new GetServerVersionCommand(UpdateContext);
??????????? DownloadDataCommand cmd2 = new DownloadDataCommand(UpdateContext);
??????????? SaveDownloadDataCommand cmd3 = new SaveDownloadDataCommand(UpdateContext);
??????????? FinishDownloadCommand cmd4 = new FinishDownloadCommand(UpdateContext);
?
??????????? Commands.Add(cmd1);
?????????? ?Commands.Add(cmd2);
??????????? Commands.Add(cmd3);
??????????? Commands.Add(cmd4);
??????? }
?
??????? #region
Public Method
??????? public void Execute()
??????? {
?????????? ?? InnerHandExecute();
??????? }
?
??????? private void InnerHandExecute()
?????? ?{
??????????? try
??????????? {
?????????????? ??if (this.Index < this.Commands.Count)
??????????????? {
??????????????????? this.Commands[this.Index].Execute();
??????????????????? this.Index++;
??????????????? }
??????????? }
??????????? catch (Exception)
??????????? {
??????????? }
??????? }
??????? #endregion
?
}
客户界面调用,很方便,主界面订阅
SmartUpdateManager
中
Context
的事件用于更新进度条,提示信息等交互信息。
private
SmartUpdateManager manager = null;
private
void InitUpdateManager()
??????? {
??????????? manager = new SmartUpdateManager();
??????????? manager.UpdateContext.ApplicationExit += new ApplicationExitHandler(manager_onApplicationExit);
??????????? manager.UpdateContext.EnabledChanged += new EnabledChangedHandler(manager_onEnabledChanged);
??????????? manager.UpdateContext.ProcessBarValueChanged += new ProgressarValueChangedHandler(manager_onProcessBarValueChanged);
??????????? manager.UpdateContext.PromptMsgChanged += new PromptMsgChangedHandler(manager_onPromptMsgChanged);
??????????? manager.UpdateContext.TextChanged += new TextChangedHandler(manager_onTextChanged);
??????????? manager.UpdateContext.VisiableChanged += new VisiableChangedHandler(manager_onVisiableChanged);
??????????? manager.UpdateContext.WorkingTipMessageChanged += new WorkingTipMessageChangedHandler(manager_onWorkingTipMessageChanged);
??????????? manager.UpdateContext.CancelEnableChanged += new CancelEnableChangedHandler(manager_onCancelEnabled);
???????????
??????? }
?
void
btnNext_Click(object sender,EventArgs e)
??????? {
??????????? try
??????????? {
??????????????? this.psbDownload.Value = 0;
??????????????? this.btnNext.Enabled = false;
??????????????? this.manager.Execute();
??????????????? //Application.DoEvents();
??????????? }
??????????? catch (Exception)
??????????? {
??????????????? //………???????????
}
?? ?????}
?
???
这样的设计很容易实现向导,实际上我实现的就是向导式的更新。一步一步提示用户。如果想在中间增加一个环节,比如增加一个欢迎环节,一个校对文件的环节。那么我们只需要更改
SmartUpdateManager
中的代码。我们新增
2
个
WelComeCommand,ValidateCommand.
private
void InitHandleUpdate()
??????? {
??????????? Commands = new List<UpdateCommand>();
??????????? //_context = new Context();
?
??????????? GetServerVersionCommand cmd1 = new GetServerVersionCommand(UpdateContext);
??????????? DownloadDataCommand cmd2 = new DownloadDataCommand(UpdateContext);
??????????? SaveDownloadDataCommand cmd3 = new SaveDownloadDataCommand(UpdateContext);
??????????? FinishDownloadCommand cmd4 = new FinishDownloadCommand(UpdateContext);
?
??????????? //
注意这是新增的环节,欢迎环节。
??????????? WelComeCommand cmdNew1 = new WelComeCommand(UpdateContext);
??????????? //
插入另一个新环节,校对下载的文件。。。。
???????? ???ValidateCommand cmdNew2 = new ValidateCommand(UpdateContext);
?
??????????? Commands.Add(cmdNew1);?//
插到第一个环节
;
??????????? Commands.Add(cmd1);
??????????? Commands.Add(cmd2);
??????????? Commands.Add(cmdNew2);?//
插入另一个环节,校对文件环节。
??????????? Commands.Add(cmd3);
??????????? Commands.Add(cmd4);
??????? }这样的需求变更,客户端的调用不需要任何改动。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 集群容灾解决方案之Rose HA
- 数组 – 如何在Bash中附加到arguments数组(“$@”)
- angular – 从表单控件写入浏览器URL
- google-app-engine-如何使用Dockerfile运行Google App Engi
- 如何通过Docker连接到本地的MySQL服务器?
- angularjs – 在Angular指令中使用外部模板(templateURL)上
- 在docker-compose中构建图像时多个Dockerfiles失败
- Scala Swing ListView的删除/添加元素事件
- angularjs – 如何在ng-if和变量中使用过滤器?
- bash – 使用shell创建多个包含内容的文件