同一 page 内导航
当发起导航的 abilityslice 和导航目标的 abilityslice 处于同一个 page 时,您可以通过 present() 方法实现导航。如下代码片段展示通过点击按钮导航到其他 abilityslice 的方法:
@overrideprotected void onstart(intent intent) { ... button button = ...; button.setclickedlistener(listener -> present(new targetslice(), new intent())); ... }
如果开发者希望在用户从导航目标 abilityslice 返回时,能够获得其返回结果,则应当使用 presentforresult() 实现导航。用户从导航目标 abilityslice 返回时,系统将回调 onresult() 来接收和处理返回结果,开发者需要重写该方法。返回结果由导航目标 abilityslice 在其生命周期内通过 setresult() 进行设置。
@overrideprotected void onstart(intent intent) { ... button button = ...; button.setclickedlistener(listener -> presentforresult(new targetslice(), new intent(), 0)); ... } @overrideprotected void onresult(int requestcode, intent resultintent) { if (requestcode == 0) { // process resultintent here. }}
系统为每个 page 维护了一个 abilityslice 实例的栈,每个进入前台的 abilityslice 实例均会入栈。当开发者在调用 present( )或 presentforresult() 时指定的 abilityslice 实例已经在栈中存在时,则栈中位于此实例之上的 abilityslice 均会出栈并终止其生命周期。前面的示例代码中,导航时指定的 abilityslice 实例均是新建的,即便重复执行此代码(此时作为导航目标的这些实例是同一个类),也不会导致任何 abilityslice 出栈。
不同 page 间导航
不同 page 中的 abilityslice 相互不可见,因此无法通过 present() 或 presentforresult() 方法直接导航到其他 page 的 abilityslice 。 abilityslice 作为 page 的内部单元,以 action 的形式对外暴露,因此可以通过配置 intent 的 action 导航到目标 abilityslice 。 page 间的导航可以使用 startability() 或 startabilityforresult() 方法,获得返回结果的回调为 onabilityresult() 。在 ability 中调用 setresult() 可以设置返回结果。详细用法可参考根据operation的其他属性启动应用中的示例。