鸿蒙应用开发入门(六):页面间跳转

系统
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz

 [[373779]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

1. 认识Intent

Intent是对象之间传递信息的载体。

例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。Intent的构成元素包括Operation与Parameters:

2. 了解AbilitySlice路由配置

虽然一个Page可以包含多个AbilitySlice,但是Page进入前台时界面默认只展示一个AbilitySlice。默认展示的AbilitySlice是通过setMainRoute()方法来指定的。当有多个需要展示的AbilitySlice,可以通过addActionRoute()方法为MainAbilitySlice以外的AbilitySlice配置路由规则。此时,当其他Page实例期望导航到这些AbilitySlice时,可以通过AbilitySlice之间的跳转,显示出这张页面。

  1. public class MyAbility extends Ability { 
  2.  
  3. @Override 
  4.  
  5. public void onStart(Intent intent) { 
  6.  
  7. super.onStart(intent); 
  8.  
  9. // set the main route 
  10.  
  11. setMainRoute(MainSlice.class.getName()); 
  12.  
  13. // set the action route 
  14.  
  15. addActionRoute("action.pay", PaySlice.class.getName()); 
  16.  
  17. addActionRoute("action.scan", ScanSlice.class.getName()); 
  18.  
  19.  

 addActionRoute()方法中使用的动作命名,需要在应用配置文件(config.json)中注册:

  1.  
  2. "module": { 
  3.  
  4. "abilities": [ 
  5.  
  6.  
  7. "skills":[ 
  8.  
  9.  
  10. "actions":[ 
  11.  
  12. "action.pay"
  13.  
  14. "action.scan" 
  15.  
  16.  
  17.  
  18.  
  19. ... 
  20.  
  21.  
  22.  
  23. ... 
  24.  
  25.  
  26. ... 
  27.  

 3. 同一个Page里的AbilitySlice1与AbilitySlice2间的跳转(无参,带参,回值)

1)无参数跳转

  1. @Override 
  2.  
  3. public void onStart(Intent intent) { 
  4.  
  5. super.onStart(intent); 
  6.  
  7. super.setUIContent(ResourceTable.Layout_ability_main); 
  8.  
  9. Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  10.  
  11. text.setClickedListener(component->{ 
  12.  
  13. Intent intent1 = new Intent(); 
  14.  
  15. present(new MainAbilitySlice1(),intent1); 
  16.  
  17. }); 
  18.  

 2)带参数跳转

(1)产生参数端的AbilitySlice

  1. @Override 
  2.  
  3. public void onStart(Intent intent) { 
  4.  
  5. super.onStart(intent); 
  6.  
  7. super.setUIContent(ResourceTable.Layout_ability_main); 
  8.  
  9. Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  10.  
  11. text.setClickedListener(component->{ 
  12.  
  13. //有参数跳转 
  14.  
  15. Intent intent1 = new Intent(); 
  16.  
  17. intent1.setParam("user","钟发发"); 
  18.  
  19. present(new MainAbilitySlice1(),intent1); 
  20.  
  21. }); 
  22.  

 (2)接收参数端的AbilitySlice

  1. public class MainAbilitySlice1 extends AbilitySlice { 
  2.  
  3. Text text; 
  4.  
  5. String oldText; 
  6.  
  7. @Override 
  8.  
  9. public void onStart(Intent intent) { 
  10.  
  11. super.onStart(intent); 
  12.  
  13. super.setUIContent(ResourceTable.Layout_ability_main1); 
  14.  
  15. text = (Text) findComponentById(ResourceTable.Id_text_helloworld1); 
  16.  
  17. if(intent != null){ 
  18.  
  19. String user = intent.getStringParam("user"); 
  20.  
  21. oldText = text.getText(); 
  22.  
  23. text.append("," + user); 
  24.  
  25.  
  26.  
  27. @Override 
  28.  
  29. protected void onInactive() { 
  30.  
  31. super.onInactive(); 
  32.  
  33.  
  34. .... 
  35.  

 3)带参数跳转+返回值

(1)参数产生端

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.  
  3. @Override 
  4.  
  5. public void onStart(Intent intent) { 
  6.  
  7. super.onStart(intent); 
  8.  
  9. super.setUIContent(ResourceTable.Layout_ability_main); 
  10.  
  11. Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  12.  
  13. text.setClickedListener(component->{ 
  14.  
  15. //有参数跳转 
  16.  
  17. Intent intent1 = new Intent(); 
  18.  
  19. intent1.setParam("user","钟发发"); 
  20.  
  21. presentForResult(new MainAbilitySlice1(),intent1,120); 
  22.  
  23. }); 
  24.  
  25.  
  26. ... 
  27.  

 (2)参数接收端

  1. public class MainAbilitySlice1 extends AbilitySlice { 
  2.  
  3. Text text; 
  4.  
  5. String oldText; 
  6.  
  7. @Override 
  8.  
  9. public void onStart(Intent intent) { 
  10.  
  11. super.onStart(intent); 
  12.  
  13. super.setUIContent(ResourceTable.Layout_ability_main1); 
  14.  
  15. text = (Text) findComponentById(ResourceTable.Id_text_helloworld1); 
  16.  
  17. if(intent != null){ 
  18.  
  19. String user = intent.getStringParam("user"); 
  20.  
  21. oldText = text.getText(); 
  22.  
  23. text.setText(oldText + "," + user); 
  24.  
  25.  
  26. //参数接收端在对文字点击 
  27.  
  28. text.setClickedListener(component -> { 
  29.  
  30. //1.给跳转来的页面返回值 
  31.  
  32. Intent intent1 = new Intent(); 
  33.  
  34. intent1.setParam("password","123456"); 
  35.  
  36. setResult(intent1); 
  37.  
  38. //2.接收本AbilityAlice,自动返回上一页 
  39.  
  40. terminate(); 
  41.  
  42. }); 
  43.  
  44.  
  45. @Override 
  46.  
  47. protected void onInactive() { 
  48.  
  49. super.onInactive(); 
  50.  
  51. text.setText(oldText); 
  52.  
  53.  
  54. ... 
  55.  

 (3)回到参数产生端接收返回值

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.  
  3. Text text; 
  4.  
  5. @Override 
  6.  
  7. public void onStart(Intent intent) { 
  8.  
  9. super.onStart(intent); 
  10.  
  11. super.setUIContent(ResourceTable.Layout_ability_main); 
  12.  
  13. text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  14.  
  15. text.setClickedListener(component->{ 
  16.  
  17. //有参数跳转 
  18.  
  19. Intent intent1 = new Intent(); 
  20.  
  21. intent1.setParam("user","钟发发"); 
  22.  
  23. presentForResult(new MainAbilitySlice1(),intent1,120); 
  24.  
  25. }); 
  26.  
  27.  
  28. @Override 
  29.  
  30. protected void onResult(int requestCode, Intent resultIntent) { 
  31.  
  32. super.onResult(requestCode, resultIntent); 
  33.  
  34. if(requestCode==120){ 
  35.  
  36. String password = resultIntent.getStringParam("password"); 
  37.  
  38. text.setText("返回值:" + password); 
  39.  
  40.  
  41.  
  42. ... 
  43.  

 4. 不同的Page直接跳转,第一个鸿蒙应用例子写的就是这个,核心代码:

  1. if (button != null) { 
  2.  
  3. // 为按钮设置点击回调 
  4.  
  5. button.setClickedListener(new Component.ClickedListener() { 
  6.  
  7. @Override 
  8.  
  9. public void onClick(Component component) { 
  10.  
  11. Intent secondIntent = new Intent(); 
  12.  
  13. // 指定待启动FA的bundleName和abilityName 
  14.  
  15. Operation operation = new Intent.OperationBuilder() 
  16.  
  17. .withDeviceId(""
  18.  
  19. .withBundleName("com.example.myapplication"
  20.  
  21. .withAbilityName("com.example.myapplication.SecondAbility"
  22.  
  23. .build(); 
  24.  
  25. secondIntent.setOperation(operation); 
  26.  
  27. startAbility(secondIntent); // 通过AbilitySlice的startAbility接口实现启动另一个页面 
  28.  
  29.  
  30. }); 
  31.  

 5. Page1的MainAbilitySlice跳转Page2的AbilitySlice1

  1. @Override 
  2.  
  3. public void onStart(Intent intent) { 
  4.  
  5. super.onStart(intent); 
  6.  
  7. super.setUIContent(ResourceTable.Layout_ability_main); 
  8.  
  9. text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  10.  
  11. text.setClickedListener(component->{ 
  12.  
  13. Intent intent1 = new Intent(); 
  14.  
  15. intent1.setAction("abilityslice1"); //关键是配置文件里配置action和Ability里注册路由 
  16.  
  17. startAbility(intent1); 
  18.  
  19. }); 
  20.  

 文章内容已录制成视频课程《鸿蒙手机应用开发入门》https://edu.51cto.com/course/26133.html

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-09-18 14:45:26

鸿蒙HarmonyOS应用

2010-05-11 16:55:12

Windows Pho

2024-05-21 08:04:50

ArkTS鸿蒙应用开发语言

2023-07-31 17:35:31

ArkTS鸿蒙

2020-12-25 10:52:28

鸿蒙HarmonyOS应用开发

2023-08-04 15:00:43

ArkTS语言鸿蒙

2021-01-25 09:58:01

鸿蒙HarmonyOS应用开发

2024-01-03 15:31:16

网格布局ArkTSGrid

2015-05-05 10:51:32

php页面跳转方法

2020-11-09 11:56:49

HarmonyOS

2020-12-24 12:01:16

鸿蒙HarmonyOS应用开发

2021-06-22 16:40:32

鸿蒙HarmonyOS应用

2024-01-03 08:22:32

移动应用页面跳转

2021-05-18 09:49:08

鸿蒙HarmonyOS应用

2020-09-28 15:13:04

鸿蒙

2021-01-06 11:21:56

鸿蒙HarmonyOS应用开发

2012-06-07 09:33:13

Windows Pho

2022-11-04 14:58:59

应用开发鸿蒙

2013-09-13 13:16:05

2022-03-15 08:00:00

Flutter开发工具
点赞
收藏

51CTO技术栈公众号