一:链接页(Linking pages)jQuery Mobile设计用来与简单的页面链接约定协同工作。
显然,你可以链接页面和资源像你平常那样,jQuery Moblie会自动处理页面的请求,以单页面模型,如果可能的话使用Ajax。当Ajax不能用时(如不是同一个域名下,或者在链接中指定了类似属性) 将使用正常的http请求。
这种模型的目标是允许开发者以最佳实践来创建网站:没有配置的原始链接将正常工作,富本地体验的不通过标准的HTTP请求来获得。
二:默认的链接行为:Ajax(Default link behavior:Ajax)
为了让页面的切换动画成为可能,所以指向外部页面的链接将通过Ajax请求来加载。
为了达到非侵入的效果(To do this unobtrusively),jQuery Mobile框架将转换链接的href来创建一个Ajax形式的请求(Hijax)同时显示一个正在加载的图标。这些都由jQuery Mobile自动完成。
如果Ajax请求成功,新的页面将添加进DOM中,所以的手机小部件将自动初始化,然后新页面将以动画的方式进入视图。
如果Ajax请求失败,框架会显示一条小的错误信息--几秒之后会消失,所以并不会中断导流。更多请查看一个(错误消息示例)
注意:你并不能通过Ajax导航活动链接到多页面文档,因为框架将只会加载它发现的第一个页面,而不是整个页面集合。在这种情况下你必要使用无Ajax的链接(参见下一节)来进行一个整个页面的刷新来阻止潜在的hash碰撞。当前这有一个子页面插件来使加载多文档页面成为可能。
三:非Ajax的链接(Linking without Ajax)
指向其它域名的链接或者有rel="external"属性,data-ajax="false"或target属性将不被通过Ajax加载的链接。这些链接会引起一个完全的页面刷新而没有动画切换效果。
两个属性(rel="external"和data-ajax="false")都有相同的效果,但是它们的语义不同:rel="external" 应该用于当一个链接指向另一个站点或者域名。而data-ajax="false"用于在你的域名之内一个页面Ajax加载的选项。出于安全的限制和Ajax的行为这个框架总是选择连接到外部的域名(译注:这个不太理解,原文:the framework always opts linkis to external domains out of the Ajax behavior)
注意:构建一个jQuery Mobile应用程序时,当Ajax导航系统被全局禁用或者单独的链接常常被禁用时,我们推荐禁用$.mobile.pushStateEnabled这个全局配置选项来避免在某些浏览器上不一致的导航效果。
四:多页面文档中的链接(Linking within a multi-page document)
一个单独的HTML文档可以包含一个或多个页面('page')容器,有多个以一个属性data-role的值为"page"的div,这允许你在一个音单独的HTML文档中创建一个小站点或者应用。当页面加载时jQuery Mobile将简单的显示在源代码中发现的第一个'page'
如果一个在多页面文档中的链接指向一个锚(#foo),这个框架将查找一个相应ID(id="foo")的页面。如果在这个HTML文档中找到了这个页面,框架将反这个页面容器转到视图。可以在本地实现无缝导航。对于用户来说内部的页面('page')和外部的'page'看起来一样,除了外部的页面在加载的时候会显示一个Ajax的加载图标。两种情况,框架都将会更新页面的URL的hash,以便支持后退按钮,深度链接和书签。
注意:如果你正从一个通过Ajax加载的页面链接到一个包含多个内部page的页面的话,你需要为此链接添加一个rel="external"或者data-ajax="false"的属性。这会通知框架完成一个完全的页面加载以清除URL中的Ajax hash。
这个限制是因为Ajax页面通过使用hash(#)来跟踪Ajax历史。而一个多内部页面的页面使用hash来标明内部页面。所以在这两种模式下会存在 冲突。
例如一个指向多内部页面的页面看起来如下:
[code=xml]
<a href=/blog_article/multipage.html>Multi-page link</a>
五:后退按钮链接("Back" button links)
如果你在一个锚上使用属性data-rel="back" ,锚上的任何点击将会像后退按钮一样。返回一个历史记录而忽略锚的默认链接。当使用JavaScript产生'back"后退按钮时这一点特别有用,例如关闭对话框的按钮。当在你的源代码标记中使用这个特性的时候,虽然支持这个属性的浏览器将不会使用指定的href属性。但是还是提供一个有意义的值指向一个引用页的URL以方便未来支持C类浏览器。如果用户能够访问这个页面从多个引用页,指定一个有意义的href以便导航对于用户依然是本地化的,同时请记住如果你只是倒置一个转换而不需要实际的在历史记录中后退,你应该使用data-direction="reverse"。
六:重定向和链接到目录(Redirects and linking to directories)
当链接到一个目录(例如href="/blog_article/typesofcats/index.html" 而不是href="/blog_article/typeofcats/index.html"),你必要使用一个正斜杆。因为jQuery Mobile假设在URl中最后一个"/"之后的部分字符是一个文件名,后面页面引用将会创建删除前面那部分的基本url。
然后,你能你可以解决这个问题给你的页面提供一个指定的data-url属性。当你这样做的时候,jQuery Mobile将使用那个属性值来更新URL。而不是用来请求那个页面的Url。
这样允许你返回作为重定向结果改变的URL。例如你提交一个表单到"/login.html"但是当成功提交之后页面从url"account"返回。这个工具允许在这些情况下你控制jQuery Mobile的历史记录,下面是一个例子:
接下来的链接指向"docs-links-urltest/index.html":
测试链接,这个链接是一个目录并带一个index页面。返回的页面将改变更新hash为"/docs/pages/docs-links-urltest"和一个正斜杆。这个通过在页面源代码中的data-url属性来完成的。记住,这个值将替换整个条目的hash。同时当通过刷新请求时一个URL是实际的解析为一个正确的页面还是一个深度的连接。
了解更多关于导航模型,Ajax和hashes及历史的技术细节在Jquery mobile中。
七:链接示例(Link examples)
所有标准的HTML的链接类型都被支持,除了上面例举的一些类型。下面是一些常用链接类型的示例:
(译注:示例效果请看原文,下面是示例的代码)
[code=xml]
<ul data-role="listview" data-inset="true" data-theme="d" data-divider-theme="d">
<li data-role="list-divider">Links that will be Ajax-loaded with page transitions</li>
<li><a href="/index.html">Link in the same domain</a></li>
<li><a href="/pages/dialog.html" data-rel="dialog">Dialog link: data-rel="dialog" (not tracked in history)</a></li>
<li data-role="list-divider">Links that will refresh the page</li>
<li><a href="http://www.jquery.com">External domain</a></li>
<li><a href="/index.html" rel="external">Link with rel="external"</a></li>
<li><a href="/blog_article/index.html" data-ajax="false">link with [data-ajax="false"]</a></li>
<li><a href="/index.html" target="foo">Link with target="foo"</a></li>
<li data-role="list-divider">Email links</li>
<li><a href="mailto:jdoe@foo.com">Basic email: mailto:jdoe@foo.com</a></li>
<li><a href="mailto:jdoe@foo.com?cc=bill@bar.com&bcc=mark@abc.com&subject=Happy%20Birthday&body=Best%20wishes!">Mailto with a cc:, bcc:, subject and body pre-filled</a></li>
<li data-role="list-divider">Phone links</li>
<li><a href="tel:15555555555">Phone: tel:15555555555</a></li>
<li data-role="list-divider">Other</li>
<li><a href="#">A href="#" will return false</a></li>
</ul>
原文链接:http://jquerymobile.com/demos/1.0/docs/pages/page-links.html
http://blog.csdn.ofcdn.net/ch_soft/article/details/6948119
http://blog.csdn.ofcdn.net/ch_soft/article/details/6947695
我们在开发项目的过程中,会涉及到该应用中多个Activity组件之间的跳转,或者夹带其它应用的可复用的Activity。例如我们可能希望跳转到原来某个Activity实例,而不是产生大量重复的 Activity。这样就需要我们为 Activity 配置特定的加载模式,而不是使用默认的加载模式。
Activity 有四种加载模式
[1] standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
[2] singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
[3] singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
[4] singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
设置启动模式的位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 属性。
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。
这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。
加载模式分类及在哪里配置Activity有四种加载模式:
- standard
- singleTop
- singleTask
- singleInstance
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
<activity android:name="ActB" android:launchMode ="singleTask"></activity>
也可以在Eclipse ADT中图形界面中编辑:
区分Activity的加载模式,通过示例一目了然。这里编写了一个Activity A(ActA)和Activity B(ActB)循环跳转的例子。对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。
standard首先说standard模式,也就是默认模式,不需要配置launchMode。先只写一个名为ActA的Activity:
例子中都没有用layout,免得看着罗嗦。可见是ActA –> ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。
第一个界面:
点击按钮后:
可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的,intent将发送给新的实例。
现在点Android设备的回退键,可以看到是按照刚才创建Activity实例的倒序依次出现,类似退栈的操作,而刚才操作跳转按钮的过程是压栈的操作。如下图:
singleTopsingleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不 过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
还是用刚才的示例,只需将launchMode改为singleTop,就能看到区别。
运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例。如果回退,将退出应用。
singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。
如果是A Activity跳转到B Activity,再跳转到A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A Activity的新实例,因为当时的栈顶不是A Activity实例。
ActA类稍作改动:
ActB类:
ActB类使用默认(standard)加载,ActA使用singleTop加载。结果类似下图:
如果把ActA的加载模式改为standard,情况一样。
现有2个项目,taskA、taskB。taskA负责调用taskB中指定的界面。
taskB中有3个界面,a、b、c,每个界面显示它所在的task id。
SingleTask:
其中b界面被声明为SingleTask。
先运行taskB,显示a界面,由a界面调用b界面,这时b界面的taskid与a界面的taskid是一致的,说明b界面与a界面在同一个task中;由b界面调用c界面时,c界面的taskid与a和b界面的taskid一致,说明这三个界面是在同一个task中。当前显示的是c界面,此时按Home键回到桌面,运行taskA的界面调用taskB的b界面,这时b界面显示出来,它的taskid没有变,还是之前的taskid,只不过之前显示的是c界面,这时c界面已经不知所踪,这时再按back键,则回到了a界面,然后是taskA的界面。
这说明,SingleTask所标注的Activity在被自身的app调用时,是不新建task的,同时,如果系统中存在了这个SingleTask界面的实例时,会将其所在的task切换到前台,并把SingleTask界面之后开启的其他界面全部关闭(有待考证是否关闭)。
另外有一种情况,例如:a界面被调用,这时按Home键返回到桌面,启动taskA,并调用b界面,这时b界面的taskid与a界面的一致,说明b界面与a界面同属于一个task。如果直接运行taskA调用b界面,b的taskid与taskA的界面的taskid不同,说明在新task中实例化了b界面,由b界面调用c界面,c界面的taskid与b界面一致,说明b与c同属于一个task。
SingleInstance:
将b界面声明为SingleInstance。
先运行taskB,显示a界面,由a界面调用b界面,这时b界面的taskid与a界面的taskid不同,说明b界面是在新task中生成的实例;由b界面调用c界面,c界面的taskid与a界面的taskid相同,说明a、c界面同属于一个task。
由此可以看出SingleTask与SingleInstance是有本质区别的,而不是像网上说的那样,都是task的root activity,这是有错误的。