官方文档解释

Intent常用用于页面跳转或者模块之间跳转时使用的工具,通常页面之间传递信息需要用到这个,那么首先我们来开下官方是怎么定义的

基本概念

Intent是对象之间传递信息的载体。例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。Intent的构成元素包括Operation与Parameters,具体描述参见表1。在这里插入图片描述
当Intent用于发起请求时,根据指定元素的不同,分为两种类型:

  • 如果同时指定了BundleName与AbilityName,则根据Ability的全称(例如,“com.demoapp.FooAbility”)来直接启动应用。
  • 如果未同时指定BundleName和AbilityName,则根据Operation中的其他属性来启动应用。

话不多说,我们直接在案例中探寻

案例

指定BundleName与AbilityName实现跳转

这个是最常用的一种跳转方法,在之前博客“开发鸿蒙的第一个Hello World的Java页面以及页面间跳转功能实现”中已经提到过,这里就不重复讲
链接地址:https://blog.csdn.net/u010574271/article/details/108884289

未指定BundleName和AbilityName实现跳转

这种方法可以实现一个应用调用另一个应用的能力,类似于手机上有多个浏览器,当打开链接时可以挑选某一个浏览器打开,具体操作如下

被调用应用改造

新建被调用应用wear4

在DevEco Studio中我们点击file->new->new project
在这里插入图片描述

输入项目名称为wear4
在这里插入图片描述

新建DemoAbilitySlice

在slice将MainAbilitySlice复制粘贴一下,将新文件名称改为DemoAbilitySlice
在这里插入图片描述
将DemoAbilitySlice页面显示的文字改为“wear demo”
在这里插入图片描述

MainAbility中添加路由

MainAbility 如下:

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
        addActionRoute(Intent.ACTION_QUERY_WEATHER, DemoAbilitySlice.class.getName());
    }
}

config.json改造

作为处理请求的对象,首先需要在配置文件中声明对外提供的能力,以便系统据此找到自身并作为候选的请求处理者
在这里插入图片描述

调用应用改造

我们的调用应用为wear22,其新建过程参考前面博客“开发鸿蒙的第一个Hello World的Java页面以及页面间跳转功能实现”

改造MainAbilitySlice

在MainAbilitySlice中,首先定义一个全局变量
private static final int REQ_CODE_QUERY_WEATHER = 000000;
新建queryWeather方法用于调用其它应用
private void queryWeather() {
        Intent intent = new Intent();
        Operation operation = new Intent.OperationBuilder()
                .withAction(Intent.ACTION_QUERY_WEATHER)
                .build();
        intent.setOperation(operation);
        startAbilityForResult(intent, REQ_CODE_QUERY_WEATHER);
    }

这里我们发现没有使用withBundleName和withAbilityName,而是使用.withAction(Intent.ACTION_QUERY_WEATHER),有这个配置后就会搜寻有相关配置的相关页面

改造onAbilityResult方法

接下来我们改造onAbilityResult方法用于返回时调用

@Override
    protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
        switch (requestCode) {
            case REQ_CODE_QUERY_WEATHER:
                return;
            default:
        }
    }

按钮监听调用queryWeather()
@Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_main_layout); // 加载XML布局
        Button button = (Button) findComponentById(ResourceTable.Id_button);

        if (button != null) {
            // 为按钮设置点击回调
            button.setClickedListener(new Component.ClickedListener() {
                @Override
                public void onClick(Component component) {
                    queryWeather();
                }
            });
        }
    }

断点调试

调用与被调用方打断点

我们在wear4的DemoAbilitySlice的onActive打上断点

在这里插入图片描述

在wear22的MainAbilitySlice的onAbilityResult方法内打上断点

在这里插入图片描述

以debug方式启动两个应用

手表模拟器启动后,分别以debug方式启动两个应用
在这里插入图片描述

回到wear22主页面

点击圆圈回到主页,然后点击圆圈到应用列表,进入wear22应用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

点击调试

点击按钮,可以看到线程进入wear4项目中DemoAbilitySlice的onActive断点中了,按F9后线程跑下去,再看手表,页面跳转到DemoAbilitySlice中去了
在这里插入图片描述
点击返回按钮
在这里插入图片描述
线程又运行到wear22项目中MainAbilitySlice的onAbilityResult的断点中去了
在这里插入图片描述
且页面回到了wear22主页面了
在这里插入图片描述

总结:1.Intent的Operation可以实现不指定特定包和特定AbilityName就能是是实现跳转,只需要配置withAction,然后startAbilityForResult实现跳转
2.同时被调用的应用的配置文件中声明对外提供的能力
3.跳转后会调用被调用页面的onActive()方法
4.当返回后,会调用回掉方法onAbilityResult

更多技术交流请加入QQ群
群名称:华为鸿蒙harmonyos开发
群 号:1164091073

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐