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