DevEco 页面跳转与Ability的生命周期(笔记)

一、同一页面不同切片的跳转

  • 无参跳转
  • 有参跳转
  • 有/无参有返回值跳转

 

ability_main.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical"
    ohos:alignment="center"
    >
   <Button
       ohos:id="$+id:but1"
       ohos:height="match_content"
       ohos:width="match_content"
       ohos:background_element="#FF00FF"
       ohos:layout_alignment="horizontal_center"
       ohos:text="无参无返回的跳转"
       ohos:text_size="40vp"
       />
    <Button
        ohos:id="$+id:but2"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#FF00FF"
        ohos:layout_alignment="horizontal_center"
        ohos:text="有参无返回的跳转"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:but3"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#FF00FF"
        ohos:layout_alignment="horizontal_center"
        ohos:text="有参有返回的跳转"
        ohos:text_size="40vp"
        />

</DirectionalLayout>

abilityslice1.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
    <Text
        ohos:id="$+id:text1"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#FF00FF"
        ohos:text="无参无返回的跳转"
        ohos:text_size="40vp"
        />
</DirectionalLayout>

abilityslice2.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
    <Text
        ohos:id="$+id:text2"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#FF00FF"
        ohos:text="有参无返回的跳转"
        ohos:text_size="40vp"
        />
</DirectionalLayout>

abilityslice3.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
    <Text
        ohos:id="$+id:text3"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#FF00FF"
        ohos:text="有参右有返回的跳转"
        ohos:text_size="40vp"
        />
</DirectionalLayout>

 新建3个页面切片

 

为config添加动作(别名) 

修改MainAbility

package com.example.myapplication;

import com.example.myapplication.slice.AbilitySlice1;
import com.example.myapplication.slice.AbilitySlice2;
import com.example.myapplication.slice.AbilitySlice3;
import com.example.myapplication.slice.MainAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        //添加主要子界面
        super.setMainRoute(MainAbilitySlice.class.getName());
        //添加其他子页面
        super.addActionRoute("slice1",AbilitySlice1.class.getName());
        super.addActionRoute("slice2", AbilitySlice2.class.getName());
        super.addActionRoute("slice3",AbilitySlice3.class.getName());
    }
}

MainAbilitySlice 

package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.window.dialog.ToastDialog;

public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener{
    Button but1;
    Button but2;
    Button but3;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        but1 = (Button)findComponentById(ResourceTable.Id_but1);
        but2 = (Button)findComponentById(ResourceTable.Id_but2);
        but3 = (Button)findComponentById(ResourceTable.Id_but3);
        but1.setClickedListener(this);
        but2.setClickedListener(this);
        but3.setClickedListener(this);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

    //requestCode为请求码,用来确认当前结果过是哪来的
    //resultIntent为结果意图,返回的意图对象
    @Override
    protected void onResult(int requestCode, Intent resultIntent) {
        super.onResult(requestCode, resultIntent);
        if(requestCode==200){
            //第二个参数为默认结果
            boolean result = resultIntent.getBooleanParam("result",false);
            ToastDialog td = new ToastDialog(this);
            if(result){
                td.setText("登录成功");
            }
            else{
                td.setText("登录失败");
            }
            td.setDuration(2000);
            td.show();
        }
    }

    @Override
    public void onClick(Component component) {
        //意图,即跳转时我们要做的事情
        //参数1.确定跳转时跳转到哪一个设备:operation
        //参数2.在跳转的时候是否需要带上参数:parameter
        //如果是在同一个Ability下,那么第一个参数可以不写
        //如果不需要参数,则也可以不写第二个参数


        if(component == but1){
            //无参无返回的跳转
            //创建意图对象
            Intent i = new Intent();
            //跳转
            present(new AbilitySlice1(),i);

        }
        else if(component == but2){
            //有参无返回的跳转
            Intent i = new Intent();
            i.setParam("username","zhangsan");
            i.setParam("password","123456");
            present(new AbilitySlice2(),i);
        }
        else if(component == but3){
            //有参有返回的跳转
            Intent i = new Intent();
            i.setParam("username","zhangsan");
            i.setParam("password","123456");
            //请求码自己设置
           presentForResult(new AbilitySlice3(),i,200);
        }
    }
}

 AbilitySlice1

package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;

public class AbilitySlice1 extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_abilityslice1);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

 AbilitySlice2

package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;

public class AbilitySlice2 extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_abilityslice2);
        String unm = intent.getStringParam("username");
        String pwd = intent.getStringParam("password");
        Text text = (Text)findComponentById(ResourceTable.Id_text2);
        text.setText("你好,"+unm+"!密码是:"+pwd);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

 AbilitySlice3

package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.Text;

public class AbilitySlice3 extends AbilitySlice{
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_abilityslice3);
        Text text = (Text)findComponentById(ResourceTable.Id_text3);
        String unm = intent.getStringParam("username");
        String pwd = intent.getStringParam("password");
        Intent i = new Intent();
        if(pwd=="123456") {
            text.setText("你好,"+unm+"即将跳转");
            i.setParam("result",true);
            //返回意图
            setResult(i);
            //关闭当前页面
            terminate();
        }
        else{
            i.setParam("result",false);
            //返回意图
            setResult(i);
            //关闭当前页面
            terminate();
        }

    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

}

二、不同页面的跳转

  • A页面跳转到B页面的主页面
  • A页面跳转到B页面的其他页面

搭配一部分页面切片间的跳转方式即:

  • 无参跳转
  • 有参跳转
  • 有/无参有返回值跳转

创建PageAbility(不要勾选LaunchAbility:指的是APP主页面)

 准备两个Ability,三个切片(两个主切片+一个子切片)

 别忘了将子切片绑定在第二个主页面上,同时为其注册一个行动

 

package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.agp.components.Button;
import ohos.agp.components.Component;


public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener{
    Button but1;
    Button but2;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        but1 = (Button)findComponentById(ResourceTable.Id_but1);
        but2 = (Button)findComponentById(ResourceTable.Id_but2);
        but1.setClickedListener(this);
        but2.setClickedListener(this);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }


    @Override
    public void onClick(Component component) {
        if(component == but1){
            Intent i = new Intent();
            //OperationBuilder拼接参数
            //withDeviceId跳转的机器ID,“”表示本机
            //withBundleName哪一个应用上(config.json中的BundleName)
            //withAbilityName哪一个页面上(config.json中的name)
            //此时默认跳转到页面的主切面
            Operation oper = new Intent.OperationBuilder()
                    .withDeviceId("")
                    .withBundleName("com.example.myapplication.hmservice")
                    .withAbilityName("com.example.myapplication.MainAbility2")
                    .build();
            i.setOperation(oper);
            //i.setParam("test","test");
            startAbility(i);
            //startAbilityForResult(i,200);
        }
        else if(component == but2){
            //由于我们这里在config.json中注册了的,且在同一个APP中
            //因此可以用省略写法,只写有用参数,即withAction
            Intent i = new Intent();
            Operation oper = new Intent.OperationBuilder()
                    .withAction("slice2")
                    .build();
            i.setOperation(oper);
            startAbility(i);
        }
    }
}

三、Ability生命周期

  • 初始状态(Initial)
  • 闲置状态(Inactive)
  • 活跃状态(Active)
  • 隐藏状态(Background)

过程: 

  1. 初始状态:未加载组件
  2. OnStart():加载XML,仅会执行一次
  3. 闲置状态:在内存中,但未被展示
  4. onActice():展示页面
  5. 活跃状态:与用户交互
  6. onInactive():失去交点
  7. 闲置状态:在内存中,但未被展示,等待再次使用(onActice())或者等待被放入回收区(onBackground())
  8. onBackground():当不再使用时,放入可被回收区域
  9. 隐藏状态:等待回收(kill)、重新激活 (onForeground())、结束进程(stop())
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值