61阅读

windows phone 8 应用-Windows 8界面变化过大:老用户难以适应

发布时间:2017-10-15 所属栏目:Windows Phone 8.1

一 : Windows 8界面变化过大:老用户难以适应

Windows 8中Metro界面与传统界面的切换,遭到许多老用户的抱怨。

Windows 8中Metro界面与传统界面的切换,遭到许多老用户的抱怨。

导语:国外媒体今天撰文称,虽然微软对Windows 8寄予厚望,并且获得了外界的普遍好评,但由于与传统的Windows系统界面差异过大,导致老用户难以适应,这也给微软的计划蒙上了一层阴影。

以下为文章全文:

遭遇挑战

Windows 8将展示微软在下一代高性能平板电脑平台上的实力,而随着该系统的发布日益临近,外界纷纷开始测试这款新系统在现有硬件上的表现,现有的评价凸显出微软旗舰产品改版过程中遭遇的挑战。

这家全球最大软件公司表示,尽管要到今年秋天才能发布,但已经有数百万人开始在台式机、笔记本和平板电脑上使用预览版Windows 8。在下周一举行的发布会上,微软有望公布平板电脑市场的反击计划。

目前为止,多数的人都对Windows 8的Metro触摸界面发表了积极评价,但这种全新的界面同样引发了用户担忧,因为这会迫使他们放弃已经十分熟悉的老界面。

“对于已经适应了传统PC使用方式的人来说,的确有些困难。”美国市场研究公司IDC分析师阿尔·席尔瓦(Al Hilwa)说。曾经任职于微软的席尔瓦已经测试Windows 8两周之久。“如果没有触摸屏,很难用鼠标完成操作。”他说。

新的Metro界面只能运行针对该界面编写的应用,所以用户必须要切换回传统桌面才能完成特定任务,例如在苹果iTunes上听音乐。

使用繁琐

“真正令我不舒服的是,Metro应用和传统的桌面应用似乎毫不相干。”美国市场研究公司Forrester Research分析师大卫·约翰逊(David Johnson)说,“很难在他们之间相互切换,我不知道为何会这样。”

最新的测试版并非最终面市的软件,而且除了少数几位业内测试人员,还没有人在ARM架构的笔记本上使用过Windows 8,而这才是微软挑战iPad的真正利器。

微软有望于下周一发布更多消息,甚至有传言称,该公司可能推出自有品牌平板电脑。但微软拒绝对此置评。

不过,一些最忠实的用户尚未完全被微软说服。“我现在还不买账。”市场研究公司Directions on Microsoft分析师迈克尔·切里(Michael Cherry)说。

切里表示,他已经使用Windows 8好几天了,但在设置电子邮件时却碰到了问题。“我现在还不能将它作为一款制作工具,”他说,“我还不能放弃原来的产品,仍然要留着Windows 7。”

作为微软前项目经理,切里担心,由于新系统过于复杂,可能无法像Windows 7一样在初期获得热捧。

“如果一个从Windows 1.0开始就一直使用Windows系统的人都搞不定,我猜肯定会有很多人都搞不定。”他说,“百思买不会出现午夜排队购买的人群。我很希望看到这种场景,但不会出现。”

业内评价

包括《华尔街日报》的沃尔特·莫斯伯格(Walter Mossberg)和《纽约时报》的大卫·伯格(Davdi Pogue)在内,主流科技评论家尚未对5月31日发布的最新Windows 8预览版发表评论。

相对肤浅的各大科技博客普遍对Windows 8的外观赞赏有加,但几乎所有人都强调,在适应新系统时的确会遭遇障碍。

“我的感觉就像身处茫茫大海——困惑、无助、愤怒,我最终不得不改变所有的工作模式。”在线杂志《Slate》专栏作家法哈德·曼约奥(Farhaad Manjoo)说。但他也承认,Windows 8的确有很多可取之处。

与微软同处西雅图的科技博客GeekWire则没有曼约奥这么客气,他们发布了一段读者提供的视频:在视频中,这位读者的父亲因为无法回到开始目录而彻底崩溃。

“我整整一天都感觉无助,还有些牢骚满腹。”GeekWire的托德·毕舍普(Todd Bishop)说,他已经关注微软逾十年时间。

“微软总喜欢用‘快而流畅’来描述Windows 8,但我脑子里却总是蹦出另外一个词——‘新可口可乐’。”毕舍普说,他指的是可口可乐公司1980年推出的短命的新配方。

Gizmodo记者马特·霍楠(Mat Honan)称赞Windows 8很优雅,并认为Metro应用比起上一版更好、更易用,但并没有什么“令人折服之处”。

期望颇高

不可否认,对于一款用户超10亿的操作系统而言,任何的大幅改版都会遭到抵制。

由于内存消耗过大,加之安全设置过于繁琐,2007年初发布的Windows Vista遭遇了噩梦。但在随后的升级过程中逐渐好转。大约3年后,Windows 7成为微软迄今为止销售最快的操作系统,目前已经卖出5亿套。

然而,由于iOS无论从美观还是实用角度来讲都出类拔萃,抬高了用户对Windows系统的期望。

“我不会给我76岁的母亲使用Windows 8,并期待着她用这东西提高效率。”Forrester的约翰逊说,“但我也不确定二三十岁的人最初是否能流畅使用Metro界面。”

Windows 8的主要目标是个人消费者和潜在的iPad用户,而非企业用户,因为很多大企业仍在花费数百万美元升级成Windows 7。

Windows 8能否成功部分取决于搭载该系统的硬件质量和价格,这都掌握在惠普()、三星()、联想和宏碁()手中。

但即使硬件不错,微软Windows Store在线应用商店仍然无法与苹果App Store媲美,而且要真正积蓄发展势头,恐怕还需要好几年时间,这会打击消费者购买Windows平板电脑的积极性。

“我想用Windows 8,”切里说,“但我不确定他们能否涅槃重生。他们已经下注,希望能够满足我们的需求,但我不确定他们能否履行诺言。”(书聿)

二 : Windows Phone 8.1 应用生命周期(1)

一、“后退键”不会终止应用

关于 Windows Phone 8.1 的应用生命周期,第一个要知道的关键就是:“后退键”不会终止应用!

在 8.0 时代,不断的按下“后退键”就可以完全的关闭并且终止应用,但在 8.1 中,这样的行为只会让应用处在 Suspended(挂起)状态,可以通过长按“后退键”进入多任务界面查看。

那如果还想像 8.0 一样终止应用呢?(虽然不推荐也没有必要)可以在多任务界面点击应用右上角的“叉叉”或者向下滑。

二、应用生命周期

Windows Phone 8.1 应用生命周期(1)_windows phone 8 应用

应用的三个状态分别是:

A:NotRunning

也就是还没开启过应用,在多任务界面没有该应用时。

B:Running

在屏幕上显示的应用就是 Running 状态,同时只会有 1 个应用处于 Running 状态。

C:Suspended

不在屏幕上显示并能在多任务界面查看的应用则处于 Suspended(挂起)状态。

三种状态间切换的操作:

(1)NotRunning -> Running

要从 NotRunning 切换到 Running 状态,其实也就是开启应用,可通过点击应用磁贴、应用间协议启动、Cortana等方式。

在状态的切换过程中会触发 OnLaunched 事件。

(2)Running -> Suspended

当应用不再占据屏幕时则从 Running 切换到 Suspended 状态,可以是“Win”键、“返回键”,有电话打来时也会挂起。

在状态的切换过程中会触发 OnSuspending 事件。

(3)Suspended -> Running

如果在应用挂起状态时没有因为某些原因(比如内存不足)导致应用终止的话,点击磁贴或者多任务切换都会让应用从 Suspender 返回到 Running 状态。

在状态的切换过程中会依次触发 OnResuming 和OnLaunched 事件。

(4)Suspended -> NotRunning

如果在应用挂起状态时因为某些原因(比如内存不足)导致应用终止的话,则会从 Suspended 变成 NotRunning 状态。

在这过程不会触发任何事件。

Windows Phone 8.1 应用生命周期(1)_windows phone 8 应用

三、OnSuspending

因为应用在挂起状态时,并不能预测应用是否会因为某些原因(比如内存不足)而终止,而在这终止过程中也没有事件让开发者处理应用数据,所以只能在应用将要挂起时准备。因此 OnSuspending 事件变得十分重要。

若要使用 OnSuspending 方法则先要在构造函数中添加对其的引用:

  1. publicApp()
  2. {
  3. this.InitializeComponent();
  4. this.Suspending+=OnSuspending;
而在 OnSuspending 方法中可以根据需要保存页面数据,比如输入框内的文本、页面导航历史等,可以通过保存在应用独立存储中或利用 NavigationHelper 和 SuspensionManager 类等:
  1. asyncvoidOnSuspending(objectsender,SuspendingEventArgse)
  2. {
  3. SuspendingDeferraldeferral=e.SuspendingOperation.GetDeferral();
  4. awaitthis.SaveStateToLocalFile(Data.Value);
  5. awaitSuspensionManager.SaveAsync();
  6. deferral.Complete();

如果只想保存某个页面的信息则可以在 SaveState 中保存

  1. privatevoidNavigationHelper_SaveState(objectsender,SaveStateEventArgse)
  2. {
  3. e.PageState["isEditing"]=true;
  4. e.PageState["currentText"]=this.viewModel.DataItem.Title;
  5. }

NavigationHelper 和 SuspensionManager 类是添加基本页时 Visual Studio 自动添加的

  1. publicclassNavigationHelper:DependencyObject
  2. {
  3. privatePagePage{get;set;}
  4. privateFrameFrame{get{returnthis.Page.Frame;}}
  5. publicNavigationHelper(Pagepage)
  6. {
  7. this.Page=page;
  8. this.Page.Loaded+=(sender,e)=>
  9. {
  10. WINDOWS_PHONE_APP
  11. Windows.Phone.UI.Input.HardwareButtons.BackPressed+=HardwareButtons_BackPressed;
  12. e
  13. if
  14. };
  15. this.Page.Unloaded+=(sender,e)=>
  16. {
  17. WINDOWS_PHONE_APP
  18. Windows.Phone.UI.Input.HardwareButtons.BackPressed-=HardwareButtons_BackPressed;
  19. e
  20. if
  21. };
  22. }
  23. #regionNavigationsupport
  24. RelayCommand_goBackCommand;
  25. RelayCommand_goForwardCommand;
  26. publicRelayCommandGoBackCommand
  27. {
  28. get
  29. {
  30. if(_goBackCommand==null)
  31. {
  32. _goBackCommand=newRelayCommand(
  33. ()=>this.GoBack(),
  34. ()=>this.CanGoBack());
  35. }
  36. return_goBackCommand;
  37. }
  38. set
  39. {
  40. _goBackCommand=value;
  41. }
  42. }
  43. publicRelayCommandGoForwardCommand
  44. {
  45. get
  46. {
  47. if(_goForwardCommand==null)
  48. {
  49. _goForwardCommand=newRelayCommand(
  50. ()=>this.GoForward(),
  51. ()=>this.CanGoForward());
  52. }
  53. return_goForwardCommand;
  54. }
  55. }
  56. publicvirtualboolCanGoBack()
  57. {
  58. returnthis.Frame!=null&&this.Frame.CanGoBack;
  59. }
  60. publicvirtualboolCanGoForward()
  61. {
  62. returnthis.Frame!=null&&this.Frame.CanGoForward;
  63. }
  64. publicvirtualvoidGoBack()
  65. {
  66. if(this.Frame!=null&&this.Frame.CanGoBack)this.Frame.GoBack();
  67. }
  68. publicvirtualvoidGoForward()
  69. {
  70. if(this.Frame!=null&&this.Frame.CanGoForward)this.Frame.GoForward();
  71. }
  72. #ifWINDOWS_PHONE_APP
  73. privatevoidHardwareButtons_BackPressed(objectsender,Windows.Phone.UI.Input.BackPressedEventArgse)
  74. {
  75. if(this.GoBackCommand.CanExecute(null))
  76. {
  77. e.Handled=true;
  78. this.GoBackCommand.Execute(null);
  79. }
  80. }
  81. #else
  82. privatevoidCoreDispatcher_AcceleratorKeyActivated(CoreDispatchersender,
  83. AcceleratorKeyEventArgse)
  84. {
  85. varvirtualKey=e.VirtualKey;
  86. if((e.EventType==CoreAcceleratorKeyEventType.SystemKeyDown||
  87. e.EventType==CoreAcceleratorKeyEventType.KeyDown)&&
  88. (virtualKey==VirtualKey.Left||virtualKey==VirtualKey.Right||
  89. (int)virtualKey==166||(int)virtualKey==167))
  90. {
  91. varcoreWindow=Window.Current.CoreWindow;
  92. vardownState=CoreVirtualKeyStates.Down;
  93. boolmenuKey=(coreWindow.GetKeyState(VirtualKey.Menu)&downState)==downState;
  94. boolcontrolKey=(coreWindow.GetKeyState(VirtualKey.Control)&downState)==downState;
  95. boolshiftKey=(coreWindow.GetKeyState(VirtualKey.Shift)&downState)==downState;
  96. boolnoModifiers=!menuKey&&!controlKey&&!shiftKey;
  97. boolonlyAlt=menuKey&&!controlKey&&!shiftKey;
  98. if(((int)virtualKey==166&&noModifiers)||
  99. (virtualKey==VirtualKey.Left&&onlyAlt))
  100. {
  101. e.Handled=true;
  102. this.GoBackCommand.Execute(null);
  103. }
  104. elseif(((int)virtualKey==167&&noModifiers)||
  105. (virtualKey==VirtualKey.Right&&onlyAlt))
  106. {
  107. e.Handled=true;
  108. this.GoForwardCommand.Execute(null);
  109. }
  110. }
  111. }
  112. privatevoidCoreWindow_PointerPressed(CoreWindowsender,
  113. PointerEventArgse)
  114. {
  115. varproperties=e.CurrentPoint.Properties;
  116. if(properties.IsLeftButtonPressed||properties.IsRightButtonPressed||
  117. properties.IsMiddleButtonPressed)return;
  118. boolbackPressed=properties.IsXButton1Pressed;
  119. boolforwardPressed=properties.IsXButton2Pressed;
  120. if(backPressed^forwardPressed)
  121. {
  122. e.Handled=true;
  123. if(backPressed)this.GoBackCommand.Execute(null);
  124. if(forwardPressed)this.GoForwardCommand.Execute(null);
  125. }
  126. }
  127. #endif
  128. #endregion
  129. #regionProcesslifetimemanagement
  130. privateString_pageKey;
  131. publiceventLoadStateEventHandlerLoadState;
  132. publiceventSaveStateEventHandlerSaveState;
  133. publicvoidOnNavigatedTo(NavigationEventArgse)
  134. {
  135. varframeState=SuspensionManager.SessionStateForFrame(this.Frame);
  136. this._pageKey="Page-"+this.Frame.BackStackDepth;
  137. if(e.NavigationMode==NavigationMode.New)
  138. {
  139. varnextPageKey=this._pageKey;
  140. intnextPageIndex=this.Frame.BackStackDepth;
  141. while(frameState.Remove(nextPageKey))
  142. {
  143. nextPageIndex++;
  144. nextPageKey="Page-"+nextPageIndex;
  145. }
  146. if(this.LoadState!=null)
  147. {
  148. this.LoadState(this,newLoadStateEventArgs(e.Parameter,null));
  149. }
  150. }
  151. else
  152. {
  153. if(this.LoadState!=null)
  154. {
  155. this.LoadState(this,newLoadStateEventArgs(e.Parameter,(Dictionary<String,Object>)frameState[this._pageKey]));
  156. }
  157. }
  158. }
  159. publicvoidOnNavigatedFrom(NavigationEventArgse)
  160. {
  161. varframeState=SuspensionManager.SessionStateForFrame(this.Frame);
  162. varpageState=newDictionary<String,Object>();
  163. if(this.SaveState!=null)
  164. {
  165. this.SaveState(this,newSaveStateEventArgs(pageState));
  166. }
  167. frameState[_pageKey]=pageState;
  168. }
  169. #endregion
  170. }
  171. publicdelegatevoidLoadStateEventHandler(objectsender,LoadStateEventArgse);
  172. publicdelegatevoidSaveStateEventHandler(objectsender,SaveStateEventArgse);
  173. publicclassLoadStateEventArgs:EventArgs
  174. {
  175. publicObjectNavigationParameter{get;privateset;}
  176. publicDictionary<string,Object>PageState{get;privateset;}
  177. publicLoadStateEventArgs(ObjectnavigationParameter,Dictionary<string,Object>pageState)
  178. :base()
  179. {
  180. this.NavigationParameter=navigationParameter;
  181. this.PageState=pageState;
  182. }
  183. }
  184. publicclassSaveStateEventArgs:EventArgs
  185. {
  186. publicDictionary<string,Object>PageState{get;privateset;}
  187. publicSaveStateEventArgs(Dictionary<string,Object>pageState)
  188. :base()
  189. {
  190. this.PageState=pageState;
  191. }
  192. }

Windows Phone 8.1 应用生命周期(1)_windows phone 8 应用

四、OnResuming

既然在 OnSuspending 和 SaveState 方法中保存了必要数据,就可以在 OnResuming 和 LoadState 方法中获取之前保存的数据

  1. voidOnResuming(objectsender,objecte)
  2. {
  3. Data.Value+=this.CalculateOffsetTimeInDecimalSeconds(this.suspensionTime);
  4. }
  1. privatevoidNavigationHelper_LoadState(objectsender,LoadStateEventArgse)
  2. {
  3. if((e.PageState!=null)&&e.PageState.ContainsKey("isEditing"))
  4. {
  5. this.viewModel.SetEditMode();
  6. this.viewModel.DataItem.Title=e.PageState["currentText"]asstring;
  7. }
  8. }

五、OnLaunched

首先,在 OnLaunched 方法中可以通过 e.PreviousExecutionState 了解到应用之前的状态。

状态包括:

(1)CloseByUser:被用户主动在多任务界面中关闭

(2)NotRunning:没有启动过

(3)Running:启动中

(4)Terminated:挂起状态时因内存不足被系统终止

(5)Suspended:挂起状态

因此,可以通过对此的判断,根据不同情况处理应用:

  1. protectedasyncoverridevoidOnLaunched(LaunchActivatedEventArgse)
  2. {
  3. FramerootFrame=Window.Current.ContentasFrame;
  4. if(rootFrame==null)
  5. {
  6. rootFrame=newFrame();
  7. SuspensionManager.RegisterFrame(rootFrame,"AppFrame");
  8. rootFrame.Language=Windows.Globalization.ApplicationLanguages.Languages[0];
  9. if(e.PreviousExecutionState==ApplicationExecutionState.Terminated)
  10. {
  11. try
  12. {
  13. awaitSuspensionManager.RestoreAsync();
  14. }
  15. catch(SuspensionManagerException)
  16. {
  17. }
  18. }
  19. Window.Current.Content=rootFrame;
  20. }
  21. if(rootFrame.Content==null)
  22. {
  23. rootFrame.Navigate(typeof(MainPage),e.Arguments);
  24. }
  25. Window.Current.Activate();
  26. }

六、注意

以上的方法尽量使用异步操作,不要进行大量的复杂操作

本文链接:

三 : Windows / Windows Phone 8.1 预留应用名称及应用上传

最近比较懒好久没有来这里跟大家聊了,WP 8.1 的 preview 发布已经有一阵子了,并且商店支持 8.1 应用也有一段时间了。(www.61k.com)我就把这篇 8.1 的应用商店预留提交作为 8.1 的一个开始吧。

1. 首先登陆 Windows Phone DevCenter链接 

点击屏幕左侧的 提交应用 按钮 会看到如下页面,和以前的 8.0 商店的步骤一致,我们直接进入应用信息的填写。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

WP 8.1 这里和 WP 8.0 有所不同,关键是以前8.0的应用名称是从应用包中读取的,这样会造成 WP 8.0 应用名称重复的情况发生,但是 8.1解决了这个问题并且,8.1的应用商店实现了 universal (通用)的概念,换句话说就是我一个应用名称我们可以在WIN8.1 和 WP8.1 都可以使用。或者说我已有了一个Win8/8.1的应用我可以使用关联功能使用 Win 应用的名称。

这里总结了一下大家可能会遇到的几种场景:

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

实际操作中来看我们既可以在这里申请一个新的应用名称也可以和现有8.0/8.1的应用名称进行关联。这个关联非常重要,微软商店目前来说是先到先得的原则,所以你心仪的应用名称有可能被抢注滴,让然微软也有正规渠道来申诉你的应用名称。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

关联以后我们的应用就会在应用商店中显示 universal APP的 logo,这里对于我们的应用体验也是非常有帮助的。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

如果没有Win8应用我们也可以直接在这里保留一个新的应用名称。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

这里会列出你的应用的一些打包信息(剩下的市场和价格部分和8.0是一致的)

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

打包一个WP8.1的应用包 这个过程和 Win8 非常相似。鼠标右键我们的项目然后选择 store – create app packages

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

是否要上传到应用商店选择 YES!随后输入你的开发者账户。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

选择刚刚申请(预留的应用名称)

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

路径如下:

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

选择 .appxupload 文件

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

剩下的内容就是

商店说明:就是我们在下载应用前看到的应用介绍。

更新描述:用来介绍我们的应用在这个版本更新了那些内容,来吸引用户。

关键词:让用户在商店搜索的时候可以通过你输入的关键字找到我们的应用。

应用标题图像:是显示在应用商店中的图像

促销图像:是我们的应用在上推荐位的时候显示的各种展示图片。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

屏幕截图非常重要,这个图片可以让用户最直接的了解您的应用,并且要和您的应用的支持分辨率进行对应。 这里建议可以在模拟器中截图或者真机截图都可以。

windows phone 8 Windows / Windows Phone 8.1 预留应用名称及应用上传

我之前还有两篇文章分别介绍 (为大家提供借鉴)

在Windows phone store 商店中提交你的 windows phone 8 应用 

从 windows phone7 到 windows phone 8 更新 如何设配两个版本

如何在Windows应用商店中提交您的Windows 8.1 应用更新

整个流程很简单吧,我在这里先给大家做了一个介绍 有windows phone 8应用的朋友们不妨去试试。

欢迎大家在这里和我沟通交流,也可以在新浪微博上@王博_Nick

扩展:企业名称变更预留申请 / 名称变更预留申请书 / windows预留带宽

扩展:企业名称变更预留申请 / 名称变更预留申请书 / windows预留带宽

四 : Windows Phone 8手机从SD卡上安装应用的方法

微软为windows phone 8用户提供了SD卡安装应用的功能,通过该功能用户可方便在没有wifi的情况下安装应用。如需使用该功能,可参照下面的步骤。

从网页版应用商店中找到你要安装的应用,这里以快播为例,下拉网页找到手动下载和安装选项,

下载windows phone应用xap

右键选择另存为,将其应用包(xap文件)下载到本地,然后连接手机并将文件放到SD卡根目录,

复制xap文件到SD卡根目录

重启你的手机,稍等片刻后打开手机上的应用商店能看到SD卡一项,

应用商店中的SD卡选项

点击SD卡系统会自动识别放在SD卡根目录的应用文件,识别完成后选择你需要安装的应用即可。

从SD卡安装应用

本文标题:windows phone 8 应用-Windows 8界面变化过大:老用户难以适应
本文地址: http://www.61k.com/1069719.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1