华为Harmony鸿蒙开发笔记二:PageAbility页面跳转

1、从一个Ability跳转到另外一个Ability:

                    Intent secondIntent = new Intent();
                    // 指定待启动FA的bundleName和abilityName
                    Operation operation = new Intent.OperationBuilder()
                            .withDeviceId("")
                            .withBundleName("com.example.abilitydemo")//这个必须填包名
                            .withAbilityName("com.example.abilitydemo.SecondAbility")//这个必须填包名+类名
                            .build();
                    secondIntent.setOperation(operation);
                    // 通过AbilitySlice的startAbility接口实现启动另一个页面
                    startAbility(secondIntent);

跳转需要用到Intent,并使用Intent的Operation属性,设置bundleName和abilityName,这两个属性必须是包名和包名+类型,用字符串形式有点蛋疼。不过好在我们可以用Application获取包名

public class MyApplication extends AbilityPackage {
    static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");
    private static MyApplication instance;

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onInitialize() {
        super.onInitialize();
        instance=this;
    }
}

使用时:

                            .withBundleName(MyApplication.getInstance().getBundleName())//这个必须填包名
                            .withAbilityName(MyApplication.getInstance().getBundleName()+".SecondAbility")//这个必须填包名+类名

需要返回值的时候:

                    Intent secondIntent = new Intent();
                    // 指定待启动FA的bundleName和abilityName
                    Operation operation = new Intent.OperationBuilder()
                            .withDeviceId("")
                            .withBundleName(MyApplication.getInstance().getBundleName())//这个必须填包名
                            .withAbilityName(MyApplication.getInstance().getBundleName()+".ForResultAbility")//这个必须填包名+类名
                            .build();
                    secondIntent.setOperation(operation);
                    // 通过AbilitySlice的startAbility接口实现启动另一个页面
                    startAbilityForResult(secondIntent,0);
                }

接收返回值:

@Override
    protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
        super.onAbilityResult(requestCode, resultCode, resultData);
        HiLog.error(label, "onAbilityResult() requestCode="+requestCode);
        switch (requestCode) {
            case 0:
                resultData.getBundle();
                HiLog.error(label, "onAbilityResult() resultIntent.getBundle()="+resultData.getBundle());
                return;
            default:
                return;
        }
    }

2、在一个Page中,从一个Slice跳转另一个Slice,这个比较简单,一句代码:

present(new MainAbilityTwoSlice(), new Intent());

需要返回返回数据:

    static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        Button button = (Button) findComponentById(ResourceTable.Id_button);
        if (button != null) {
            // 为按钮设置点击回调
            button.setClickedListener(new Component.ClickedListener() {
                @Override
                public void onClick(Component component) {
                    presentForResult(new MainAbilityTwoSlice(), new Intent(),0);
                }
            });
        }
        MyApplication.getInstance().getBundleName();

    }

    @Override
    protected void onResult(int requestCode, Intent resultIntent) {
        HiLog.error(label, "onResult() requestCode="+requestCode);
        super.onResult(requestCode, resultIntent);
        switch (requestCode) {
            case 0:
                resultIntent.getBundle();
                HiLog.error(label, "onResult() resultIntent.getBundle()="+resultIntent.getBundle());
                return;
            default:
           return;
        }
    }

注意,这里接收返回值用的是onResult()方法,跟Ability跳转使用的onAbilityResult()方法不同,onResult()方法必须写在Slice里面,onAbilityResult()方法既可以写在Slice里,也可以写在Ability里,都会执行。

3、跳转传值,无论是跳转Ability还是跳转Slice,都要用到Intent,传参数的时候可以用Intent传参:

                    Intent secondIntent = new Intent();
                    // 指定待启动FA的bundleName和abilityName
                    Operation operation = new Intent.OperationBuilder()
                            .withDeviceId("")
                            .withBundleName(MyApplication.getInstance().getBundleName())//这个必须填包名
                            .withAbilityName(MyApplication.getInstance().getBundleName()+".ParamAbility")//这个必须填包名+类名
                            .build();
                    secondIntent.setOperation(operation);
//                    secondIntent.setBundle("123");//Bundle不能作为传值手段,只能设置为包名,要不无法跳转
                    secondIntent.setFlags(1);
                    secondIntent.setParam("key","value");
                    Student student=new Student(100,"小明");
                    secondIntent.setParam("student",student);
                    startAbility(secondIntent);

接收:

        String key=getIntent().getStringParam("key");
        HiLog.error(label, "onStart() key="+key);
        int flag=getIntent().getFlags();
        HiLog.error(label, "onStart() flag="+flag);
        Student student=getIntent().getSerializableParam("student");
        HiLog.error(label, "onStart() student="+student.toString());

 

Demo:https://download.csdn.net/download/y280903468/13786922

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值