Ability可以理解为组件,跟Android相似但是又区别,Ability分类和作用如下图:
Ability有两类,在前端显示的是FA(Feature Ability),就是图中的PageAbility,以及运行在后台的PA(Particle Ability),PA又有Service Ability和Data Ability两种。
就像Android的Activity一样,PageAbility是使用最多的Ability。
先从Ability的生命周期入手,Ability共有六个生命周期,流程如下图:
上代码:
package com.example.abilitydemo;
import com.example.abilitydemo.slice.SecondAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class SecondAbility extends Ability {
static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(SecondAbilitySlice.class.getName());
HiLog.error(label, "SecondAbility生命周期 onStart");
}
@Override
protected void onActive() {
super.onActive();
HiLog.error(label, "SecondAbility生命周期 onActive");
}
@Override
protected void onInactive() {
super.onInactive();
HiLog.error(label, "SecondAbility生命周期 onInactive");
}
@Override
protected void onBackground() {
super.onBackground();
HiLog.error(label, "SecondAbility生命周期 onBackground");
}
@Override
protected void onForeground(Intent intent) {
super.onForeground(intent);
HiLog.error(label, "SecondAbility生命周期 onForeground");
}
@Override
protected void onStop() {
super.onStop();
HiLog.error(label, "SecondAbility生命周期 onStop");
}
}
运行起来,看日志,当Ability启动时:
12-24 19:38:38.940 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onStart
12-24 19:38:38.976 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onActive
当Ability进入后台:
12-24 19:39:27.409 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onInactive
12-24 19:39:28.140 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onBackground
当Ability从后台返回可见:
12-24 19:40:07.852 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onForeground
12-24 19:40:07.857 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onActive
当Ability退出:
12-24 19:40:41.896 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onInactive
12-24 19:40:42.499 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onBackground
12-24 19:40:42.500 20832-20832/? E 00201/MY_TAG: SecondAbility生命周期 onStop
==================================================================
更全面的看一下,当A跳转B的时候:
12-25 10:53:26.217 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.onInactive
12-25 10:53:26.283 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onStart
12-25 10:53:26.307 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onActive
12-25 10:53:26.953 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.onBackground
当B跳转C的时候:
12-25 10:54:58.660 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onInactive
12-25 10:54:58.698 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 C.onStart
12-25 10:54:58.716 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 C.onActive
12-25 10:54:59.335 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onBackground
当C返回B的时候:
12-25 10:55:45.206 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 C.onInactive
12-25 10:55:45.219 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onForeground
12-25 10:55:45.222 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onActive
12-25 10:55:45.786 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 C.onBackground
12-25 10:55:45.804 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 C.onStop
当B返回A的时候:
12-25 10:56:35.264 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onInactive
12-25 10:56:35.280 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.onForeground
12-25 10:56:35.282 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.onActive
12-25 10:56:35.905 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onBackground
12-25 10:56:35.906 12406-12406/com.example.abilitydemo E 00201/MY_TAG: 生命周期 B.onStop
总结:
==================================================================================
最后,带Slice的生命周期,当A跳转B的时候:
12-25 11:01:54.508 11771-11771/? E 00201/MY_TAG: 生命周期 A.onInactive
12-25 11:01:54.508 11771-11771/? E 00201/MY_TAG: 生命周期 A.Slice.onInactive
12-25 11:01:54.575 11771-11771/? E 00201/MY_TAG: 生命周期 B.onStart
12-25 11:01:54.600 11771-11771/? E 00201/MY_TAG: 生命周期 B.Slice.onStart
12-25 11:01:54.605 11771-11771/? E 00201/MY_TAG: 生命周期 B.onActive
12-25 11:01:54.605 11771-11771/? E 00201/MY_TAG: 生命周期 B.Slice.onActive
12-25 11:01:55.236 11771-11771/? E 00201/MY_TAG: 生命周期 A.onBackground
12-25 11:01:55.237 11771-11771/? E 00201/MY_TAG: 生命周期 A.Slice.onBackground
当B返回A的时候:
12-25 11:02:46.606 11771-11771/? E 00201/MY_TAG: 生命周期 B.onInactive
12-25 11:02:46.606 11771-11771/? E 00201/MY_TAG: 生命周期 B.Slice.onInactive
12-25 11:02:46.623 11771-11771/? E 00201/MY_TAG: 生命周期 A.onForeground
12-25 11:02:46.623 11771-11771/? E 00201/MY_TAG: 生命周期 A.Slice.onForeground
12-25 11:02:46.626 11771-11771/? E 00201/MY_TAG: 生命周期 A.onActive
12-25 11:02:46.626 11771-11771/? E 00201/MY_TAG: 生命周期 A.Slice.onActive
12-25 11:02:47.245 11771-11771/? E 00201/MY_TAG: 生命周期 B.onBackground
12-25 11:02:47.245 11771-11771/? E 00201/MY_TAG: 生命周期 B.Slice.onBackground
12-25 11:02:47.246 11771-11771/? E 00201/MY_TAG: 生命周期 B.onStop
12-25 11:02:47.248 11771-11771/? E 00201/MY_TAG: 生命周期 B.Slice.onStop
总结:
最后,在同一个页面,由SliceA导航到SliceB:
12-25 22:09:45.090 3318-3318/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.SliceA.onInactive
12-25 22:09:45.098 3318-3318/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.SliceB.onStart
12-25 22:09:45.100 3318-3318/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.SliceB.onActive
12-25 22:09:45.100 3318-3318/com.example.abilitydemo E 00201/MY_TAG: 生命周期 A.SliceA.onBackground
Slice之间导航并不会出发Ability的生命周期方法
Demo:https://download.csdn.net/download/y280903468/13786913