Intent常用用于页面跳转或者模块之间跳转时使用的工具,通常页面之间传递信息需要用到这个,那么首先我们来开下官方是怎么定义的
Intent是对象之间传递信息的载体。例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。Intent的构成元素包括Operation与Parameters,具体描述参见表1。
当Intent用于发起请求时,根据指定元素的不同,分为两种类型:
话不多说,我们直接在案例中探寻
这个是最常用的一种跳转方法,在之前博客“开发鸿蒙的第一个Hello World的Java页面以及页面间跳转功能实现”中已经提到过,这里就不重复讲
链接地址:https://blog.csdn.net/u010574271/article/details/108884289
这种方法可以实现一个应用调用另一个应用的能力,类似于手机上有多个浏览器,当打开链接时可以挑选某一个浏览器打开,具体操作如下
在DevEco Studio中我们点击file->new->new project
在slice将MainAbilitySlice复制粘贴一下,将新文件名称改为DemoAbilitySlice
将DemoAbilitySlice页面显示的文字改为“wear demo”
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());
}
}
作为处理请求的对象,首先需要在配置文件中声明对外提供的能力,以便系统据此找到自身并作为候选的请求处理者
我们的调用应用为wear22,其新建过程参考前面博客“开发鸿蒙的第一个Hello World的Java页面以及页面间跳转功能实现”
private static final int REQ_CODE_QUERY_WEATHER = 000000;
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方法用于返回时调用
@Override
protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
switch (requestCode) {
case REQ_CODE_QUERY_WEATHER:
return;
default:
}
}
@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();
}
});
}
}
点击圆圈回到主页,然后点击圆圈到应用列表,进入wear22应用
点击按钮,可以看到线程进入wear4项目中DemoAbilitySlice的onActive断点中了,按F9后线程跑下去,再看手表,页面跳转到DemoAbilitySlice中去了
点击返回按钮
线程又运行到wear22项目中MainAbilitySlice的onAbilityResult的断点中去了
且页面回到了wear22主页面了
总结:1.Intent的Operation可以实现不指定特定包和特定AbilityName就能是是实现跳转,只需要配置withAction,然后startAbilityForResult实现跳转
2.同时被调用的应用的配置文件中声明对外提供的能力
3.跳转后会调用被调用页面的onActive()方法
4.当返回后,会调用回掉方法onAbilityResult
更多技术交流请加入QQ群
群名称:华为鸿蒙harmonyos开发
群 号:1164091073