Mango Trainning Course多任务.docx
- 文档编号:23316968
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:32
- 大小:1.07MB
Mango Trainning Course多任务.docx
《Mango Trainning Course多任务.docx》由会员分享,可在线阅读,更多相关《Mango Trainning Course多任务.docx(32页珍藏版)》请在冰豆网上搜索。
MangoTrainningCourse多任务
动手实验
向你的应用添加多任务
实验版本:
1.0.0
最后更新:
10/28/2018
目录
综述3
练习4
练习1–把应用程序的Tiles设置到开始菜单项中4
练习2–执行一个后台代理16
概要27
综述
原始的Windows®Phone开发工具不允许你的应用程序在未运行的时候执行操作。
这个限制了你在你的应用程序中的发挥。
但是代号为Mango的WindowsPhone允许你的应用程序在未激活时通过使用后台代理来执行操作。
为了包含后台代理的逻辑你可以在你的应用程序解决方案中添加一个新类别的项目。
这样你的应用程序就在操作系统中注册后台代理并且在你的程序休眠的时候安排代理运行。
这可以有效的使你开发的应用程序在WindowsPhoneMango中使用多任务。
另外,代号Mango的WindowsPhone允许一个应用程序用多个tile与之关联,通过选择开始菜单上的这些tiles可以使你很快定位到应用程序的不同位置。
本次实验通过这个名叫“Tidy”的应用来展示这些新特性,需要必要的步骤为你的应用实施和注册后台代理。
我们将使用一个后台代理来更新处于休眠状态程序的tiles。
目标
这个实验提供下面的指导帮你完成任务:
了解怎样把多任务的tiles放到开始菜单中
了解如何管理一个应用的tiles
在你的应用中运行一个后台代理
首要必备
下面这些先决条件将确保你从这次动手实验中得到更多:
MicrosoftVisualStudio2010或者MicrosoftVisualC#Express2010,和Windows®PhoneDeveloperTools可以从这个网址获得
知道关于如何创建WindowsPhone7
实验架构
这个实验在下面的任务中包含一个单独的练习:
1.把一个应用程序的tiles钉到开始菜单中和在开始菜单中管理一个应用程序的tiles
2.创建一个新的后台代理工程,添加这个代理的逻辑并且通过你的应用程序展示这个后台代理
估算完成所需的时间
完成这个实验将要花费30到50分钟
练习
在这个练习中,我们展示如何在主屏幕上为主程序添加次级tiles。
然后我们创建一个后台代理去更新已经订到桌面的tiles。
任务1–把工程的tiles钉到开始菜单上
1.打开位于实验存放文件目录Source\Begin下的解决方案的开始文件。
2.定位到Todo.Business工程并且在Shell工程文件夹下新建一个名为ShellTileHelpersCore类。
设置这个类为static的:
C#
publicstaticclassShellTileHelpersCore
{
//…
}
3.在这个新建类的文件上面添加下面的命名空间的声明:
C#
usingMicrosoft.Phone.Shell;
usingSystem.Linq;
4.这个类帮我们封装了tile的pinning和unpinning函数。
创建一个允许我们把tiles钉到设备开始菜单的方法:
C#
publicstaticvoidPin(Uriuri,ShellTileDatainitialData)
{
//Createthetileandpintostart.Thiswillcausetheapptobe
//deactivated
ShellTile.Create(uri,initialData);
}
ShellTile是一个定义在Microsoft.Phone.Shell命名空间中的类,这个类主要负责管理这个应用的主要和次要的tiles。
这个类提供一系列的用来创建/移除tiles的静态方法,和一个包含这个应用程序所有tiles的集合,并且可以从这个集合中查找特定的tile。
每一个应用程序的tile必须指定特定的URI,使得用户通过点击开始菜单上的tile或者通过ShellTileData声明的对应这个tile的对象实例来跟踪。
注释:
在这个任务的后面我们检测这个ShellTileData类和这个类的属性。
5.使用下面代码片段添加两个重载的UnPin方法:
C#
publicstaticvoidUnPin(stringid)
{
varitem=ShellTile.ActiveTiles.FirstOrDefault
(x=>x.NavigationUri.ToString().Contains(id));
if(item!
=null)
item.Delete();
}
publicstaticvoidUnPin(Uriuri)
{
varitem=ShellTile.ActiveTiles.FirstOrDefault
(x=>x.NavigationUri==uri);
if(item!
=null)
item.Delete();
}
为了删除已经钉在开始菜单上的tile,我们首先定位到这个tile,并且只执行这个指定tile对象的Delete方法。
这两个方法都是通过ShellTile.ActiveTiles的属性尝试定位到特定的tile。
如果定位到这个tile,就删除它
6.添加两个额外的方法到这个类中。
这两个方法对于UnPin方法本质上是相似的,但它们用来检测某个工程是否包含特定的tile:
C#
publicstaticboolIsPinned(Uriuri)
{
varitem=ShellTile.ActiveTiles.FirstOrDefault
(x=>x.NavigationUri==uri);
returnitem!
=null;
}
publicstaticboolIsPinned(stringuniqueId)
{
varitem=ShellTile.ActiveTiles.FirstOrDefault
(x=>x.NavigationUri.ToString().Contains(uniqueId));
returnitem!
=null;
}
7.保存这个文件并且导航到Todo工程。
定位到名叫Push的工程文件夹下,在这个文件下添加一个名叫ShellTileHelpersUI的类。
设置这个类为static的并且确保它是Todo命名空间下的(由于疏忽它是在Todo.Push命名空间下创建的):
C#
namespaceTodo
{
publicstaticclassShellTileHelpersUI
{
//…
}
}
这个类将使用从中ShellTileHelpersCore中引进的功能去帮助管理表现在UI上的Pin/Unpin功能。
8.我们的目的是创建tiles,这些tiles代表每个单独的工程并且在首页提供关于这个工程的简单的信息。
就像前面提到的,每个tile应该包含一个URI属性来指向一个显示这个工程的页面。
添加下面的的扩展的方法用来轻松新建来自一个指定工程的URI:
C#
publicstaticUriMakePinnedProjectUri(thisProjectp)
{
returnUIConstants.MakePinnedProjectUri(p);
}
注释:
导航到Misc文件夹下的UIConstants.cs类文件去看MakePinnedProjectUri方法的实现。
9.添加一个额外的方法用来指向一个tile的匹配相应工程颜色的背景图片的URI。
C#
publicstaticUriGetDefaultTileUri(thisProjectproject)
{
stringcolor=ApplicationStrings.ColorBlue;//defaulttoblue
ColorEntryListlist=App.Current.Resources[UIConstants.ColorEntries]as
ColorEntryList;
if(list!
=null)
{
ColorEntryprojectEntry=list.FirstOrDefault(x=>x.Color==
project.Color);
if(projectEntry!
=null)
color=projectEntry.Name;
}
returnUIConstants.MakeDefaultTileUri(color);
}
10.添加一个把应用程序钉到开始菜单上的方法。
因此,我们需要使用ShellTileData,但是因为这个类是抽象的,我们将用一个StandardTileData类去继承它。
依照下面的代码创建一个PinProject方法:
C#
publicstaticvoidPinProject(Projectp)
{
//Createtheobjecttoholdthepropertiesforthetile
StandardTileDatainitialData=newStandardTileData
{
//Definethetile’stitleandbackgroundimage
BackgroundImage=p.GetDefaultTileUri(),
Title=p.Name
};
Uriuri=p.MakePinnedProjectUri();
ShellTileHelpersCore.Pin(uri,initialData);
}
11.这个UnPinProject方法就是简单的传递工程的ID到我们之间创建的UnPin方法
C#
publicstaticvoidUnPinProject(Projectp)
{
ShellTileHelpersCore.UnPin(p.Id.ToString());
}
12.相似的,IsPinned方法是依赖前面实现的ShellTileHelpersCore方法:
C#
publicstaticboolIsPinned(thisPhoneApplicationPagepage)
{
returnShellTileHelpersCore.IsPinned(
page.NavigationService.CurrentSource);
}
publicstaticboolIsPinned(thisProjectproject)
{
Uriuri=project.MakePinnedProjectUri();
returnShellTileHelpersCore.IsPinned(project.Id.ToString());
}
13.保存这个类并且导航到在Views\Project路径下的ProjectDetailsView.xaml.cs文件。
这个类已经包含了一个名叫appBar_OnPinProject的方法。
这个方法是一个事件委托的方法,当用户点击applicationbar菜单上的pin/unpin图标时执行。
把下面的代码添加到方法体中:
C#
privatevoidappBar_OnPinProject(objectsender,EventArgse)
{
Projectproject=DataContextasProject;
if(project.IsPinned())
ShellTileHelpersUI.UnPinProject(project);
else
ShellTileHelpersUI.PinProject(project);
UpdateProjectPinIcons();
}
这个方法根据当前的状态pin或者unpin当前的工程到开始菜单,并且和applicationbaricon是一致的。
14.定位到文件中已经存在的名叫UpdateProjectPinIcons的方法。
当前的方法是空的。
添加下面代码片段中的代码,这是根据工程钉到开始菜单上的状态,用来初始化applicationbaricon和对应的文本:
C#
privatevoidUpdateProjectPinIcons()
{
if((DataContextasProject).IsPinned())
{
((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).Text=ApplicationStrings.appBar_UnPin;
((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).IconUri=newUri("/Images/appbar.unpin.png",UriKind.Relative);
}
else
{
((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).Text=ApplicationStrings.appBar_Pin;
((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).IconUri=newUri("/Images/appbar.pin.png",UriKind.Relative);
}
}
这段代码依照当前工程pin的状态来重新获取对应的文本。
15.定位到InitializePage方法,并且把下面高亮的代码片段添加到这个方法的末尾:
C#
privatevoidInitializePage()
{
if(!
pageInitialized)
{
GuidprojectID=
NavigationContext.GetGuidParam(UIConstants.ProjectIdQueryParam);
DataContext=App.ProjectsViewModel.Items.FirstOrDefault(
p=>p.Id==projectID);
if((DataContextasProject).OverdueItemCount>0)
{
textOverdueCount.Foreground=newSolidColorBrush(Colors.Red);
textOverdueDescription.Foreground=new
SolidColorBrush(Colors.Red);
}
//Ifwearelookingatthedefaultproject,disablethedeletion
//button
if(projectID==newGuid(Utils.ProjectIDDefault))
{
((ApplicationBarIconButton)ApplicationBar.Buttons[
(int)Utils.ProjectDetailsViewAppBarButtons.DeleteProject]).
IsEnabled=false;
}
UpdateProjectPinIcons();
ApplicationBar.IsVisible=true;
pageInitialized=true;
//Checkifthiswasinitializedviadeep-link..
if(!
NavigationService.CanGoBack)
{
ApplicationBarIconButtonhomeButton=
newApplicationBarIconButton{
IconUri=newUri("/Images/appbar.home.png",
UriKind.Relative),
IsEnabled=true,
Text=ApplicationStrings.appBar_Home};
homeButton.Click+=newEventHandler(homeButton_Click);
ApplicationBar.Buttons.Add(homeButton);
}
}
}
这个新代码块托管一个特殊的情况,是当应用程序是通过按钉在开始菜单上的tiles启动时的情况。
当通过tiles加载应用时,用户将会看到的是关联的项目的详情。
由于这个项目的详情页是第一页,当按下手机的back键时,程序将直接关闭而不是返回到主菜单。
因为这个原因,当通过开始菜单的tile加载应用时,我们将在applicationbar中添加一个特殊的按钮来使用户可以直接返回应用程序的主菜单。
16.保存这个类,编译并运行程序。
导航到工程管理页面(通过点击主屏幕的applicationbar上的“folder”图标)并且生成至少两个不同颜色的工程。
运行一些任务并指派他们到不同的工程。
你的工程列表现在应该看起来像下面的截图:
图形1
程序屏幕
点击程序图标,导航到程序详述页,并且通过“Pin”图片把工程钉到开始菜单:
图形2
工程详述页
图形3
钉到开始菜单的图标
17.点击这个tile可以直接到达应用程序页:
图形4
工程详述页
18.既然工程被钉到开始菜单了,观察“Pin”图标是怎么改变的。
点击unpin图标然后从这个程序导航走---然后你将看到工程的tile已经不在开始菜单了:
图形5
StartScreen
19.通过前面的步骤同样可以添加或删除其他应用程序在开始菜单上的tile:
图形6
更多应用程序的tiles
20.这里总结了这个任务。
在下一个任务,我们添加一个后台代理,用这个代理更改程序的tile。
任务2–实现一个后台代理
1.在这个解决方案中添加一个新项目工程。
我们使用“WindowsPhoneTaskSchedulerAgent”模板,给它取名为TaskLocationAgent:
图形7
Addingnewprojecttothesolution
2.在这个新项目中添加对Todo项目的引用:
Figure8
AddingaReferencetotheBackgroundAgent
打开位于Todo工程项目下Properties文件夹下的WMAppManifest.xml文件,添加引用到一个代理工程中,manifest文件需要包括一个指向新代理的元素。
XML
Name="TaskLocationAgent"Source="TaskLocationAgent" Type="TaskLocationAgent.TaskScheduler"/> 3.在使这个代理生效前,添加一些代码用来开始和停止这个代理。 导航到ViewModels文件夹下的SettingsViewModel.cs文件。 在SettingsViewModel类中新建下面类的成员 C# PeriodicTaskperiodicTask=null; conststringPeriodicTaskName="TidyPeriodic"; PeriodicTask是Microsoft.Phone.Scheduler命名空间下的类,它用来代表那些有规律运行一小段时间的预定义好的任务。 后面我们将在这个任务中使用这些变量。 4.定位到OnSave方法中,并且在“SaveSettings();”方法前面添加下面高亮显示的代码: C# voidOnSave(objectparam) { if(UseBackgroundTaskUpdates||UseBackgroundLocation) { EnableTask(PeriodicTaskName, ApplicationStrings.PeriodicTaskDescription); } else DisableTask(PeriodicTaskName); SaveSettings(); } 这个方法将要使用两个提供辅助的方法,我们将在下面的步骤中创建。 5.添加EnableTask方法: C# voidEnableTask(stringtaskName,stringdescription) { PeriodicTaskt=this.periodicTask; boolfound=(t! =null); if(! found) { t=newPeriodicTask(taskName); } t.Description=description; t.ExpirationTime=DateTime.Now.AddDays(10); if(! found) { ScheduledActionService.Add(t); } else { ScheduledActionService.Remove(taskName); ScheduledActionService.Add(t); } if(Debugger.IsAttached) { ScheduledActionService.LaunchForTest(t.Name,TimeSpan.FromSeconds(5)); } } 这个方法尝试定位到之前创建的一个定期的任务,并且更新它的描述和有效时间。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mango Trainning Course多任务 Course 任务