HarmonyOS-Ability 与 Android-Activity的区别和联系
概述
HarmonyOS与Android免不了被比较,在应用开发层级中,尤其是HarmonyOS的Ability与Android的Activity定位很相似,由于Ability分类较多,篇幅有限,本文将简单介绍Page Ability与Activity的区别与联系。
定义
Page Ability(以下简称“Page") 用于提供与用户交互的能力。一个应用可以由多个Page组成,一个Page可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和。
Activity 用户与应用互动的入口点。一个应用可以由一个或多个Activity组成,一个Activity可以由零个,一个或多个Fragment构成。Fragment是FragmentActivity行为或界面的一部分。
共同:
两者均为用户与应用的交互入口。
均可以一个或多个组成应用。
区别:
1.Ability:
public class Ability extends AbilityContext implements ILifecycle {
public Ability() {
throw new RuntimeException("Stub!");
}
...
}
AbilitySlice:
public class AbilitySlice extends AbilityContext implements ILifecycle {
public AbilitySlice() {
throw new RuntimeException("Stub!");
}
...
public final Ability getAbility() {
throw new RuntimeException("Stub!");
}
}
父类:
public abstract class Context { ... }
public interface Context { ... }
两者都继承自AbilityContext,实现ILifecycle接口。而Android中Activity:
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider {
...}
public class FragmentActivity extends ComponentActivity implements
ActivityCompat.OnRequestPermissionsResultCallback,
ActivityCompat.RequestPermissionsRequestCodeValidator {
...}
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
HasDefaultViewModelProviderFactory,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {
...}
@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ComponentActivity extends Activity implements
LifecycleOwner,
KeyEventDispatcher.Component {
...}
public class Activity extends ContextThemeWrapper implements Factory2,
Callback, android.view.KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2 {
..}
public class ContextThemeWrapper extends ContextWrapper { .. }
public class ContextWrapper extends Context { ...}
public abstract class Context {...}
Fragment:
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner {
...
}
Android中Activity与Fragment不太一样,相对于Activity,fragment轻量了不少,而AppCompatActivity具有多层父类,相对于Ability来讲,功能比较相对完善,但也复杂了不少。
2.虽然Page中可以由一个或多个AbilitySlice组成,Activity可以有零个,一个或多个Fragment,但是Page进入前台时界面默认只展示一个AbilitySlice。AlibitySlice对于Page是必不可少的,AlibitySlice更像是页面与页面,相互之间通过设置路由跳转,与Activity相似。Fragment是Android 在 Android 3.0(API 级别 11)中引入了的片段,主要目的是为大屏幕(如平板电脑)上更加动态和灵活的界面设计提供支持。由于平板电脑的屏幕尺寸远胜于手机屏幕尺寸,因而有更多空间可供组合和交换界面组件。Fragment更像是分页面,除了Activity本身的页面,还可以与一个或多个Fragment页面共显,提供更好的用户体验。Fragment是Activity的组件,AbilitySlice则是Page单个页面及其控制逻辑的总和。
生命周期
Ability生命周期:
public class Lifecycle {
public Lifecycle() {
throw new RuntimeException("Stub!");
}
public void addObserver(ILifecycleObserver observer) {
throw new RuntimeException("Stub!");
}
public void removeObserver(ILifecycleObserver observer) {
throw new RuntimeException("Stub!");
}
public Lifecycle.Event getLifecycleState() {
throw new RuntimeException("Stub!");
}
public static enum Event {
UNDEFINED,
ON_START,
ON_INACTIVE,
ON_ACTIVE,
ON_BACKGROUND,
ON_FOREGROUND,
ON_STOP;
private Event() {
}
}
}
Activity生命周期:
public abstract class Lifecycle {
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@NonNull
AtomicReference<Object> mInternalScopeRef = new AtomicReference<>();
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
@SuppressWarnings("WeakerAccess")
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
@SuppressWarnings("WeakerAccess")
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
不管是流程图还是源代码,Ability和Activity的生命周期大致相同。
|Ability| Activity|
|--|--|
| onStart()|onCreate(),onStart() |
| onActive()|onResume() |
| onInactive()|onPause() |
| onBackground()|onStop() |
| onForeground()|onRestart() |
| onStop()|onDestory()|
虽部分生命周期名称可以对应,但是对于生命周期各阶段的具体定义存在很大不同:
1.创建。HarmonyOS首次创建Page实例时,触发onStart()。对于一个Page实例,该回调在其生命周期过程中仅触发一次,Page在调用onStart()后将进入INACTIVE状态。开发者必须重写该方法,并在此配置默认展示的AbilitySlice。
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(FooSlice.class.getName());
Android在系统首次创建 Activity 时onCreate()。Activity 会在创建后进入“已创建”状态。在 onCreate() 方法中,您需执行基本应用启动逻辑,该逻辑在 Activity 的整个生命周期中只应发生一次。用于将数据绑定到列表,进行相关关联,并实例化某些类作用域变量,或回复保存的状态。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// recovering the instance state
if (savedInstanceState != null) {
gameState = savedInstanceState.getString(GAME_STATE_KEY);
}
// set the user interface layout for this activity
// the layout file is defined in the project res/layout/main_activity.xml file
setContentView(R.layout.main_activity);
}
2.可见。HarmonyOS Page调用onStart()后进入INACTIVE状态。Android中当 Activity 进入“已开始”状态时,系统会调用onStart() 。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持互动做准备。此时只是可见,但不能与用户进行交互,应用通过此方法来初始化维护界面的代码。不管是哪种系统,此状态都是非常快速地完成,然后进入交互状态。
@Override
protected void onStart() {
super.onStart();
}
3.交互。HarmonyOS Page会在进入INACTIVE状态后来到前台,然后系统调用onActive()。Page在此之后进入ACTIVE状态,该状态是应用与用户交互的状态。Page将保持在此状态,除非某类事件发生导致Page失去焦点,比如用户点击返回键或导航到其他Page。
@Override
protected void onActive() {
super.onActive();
}
Android Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这时,生命周期组件可以启用在组件可见且位于前台时需要运行的任何功能。这是应用与用户互动的状态,应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。
@Override
protected void onResume() {
super.onResume();
}
4.失焦。HarmonyOS Page失去焦点时,系统将调用onInactive(),此后Page进入INACTIVE状态。开发者可以在此回调中实现Page失去焦点时应表现的恰当行为。此后,Page可能重新回到ACTIVE状态,系统将再次调用onActive()回调。因此,开发者通常需要成对实现onActive()和onInactive(),并在onActive()中获取在onInactive()中被释放的资源。
@Override
protected void onInactive() {
super.onInactive();
}
Android 用户将要离开Activity 的第一个标志(尽管这并不总是意味着 Activity 会被销毁)将调用onPause();此方法表示 Activity 不再位于前台(尽管在用户处于多窗口模式时 Activity 仍然可见)。
使用 onPause() 方法暂停或调整当 Activity 处于“已暂停”状态时不应继续(或应有节制地继续)的操作,以及希望很快恢复的操作。此时进入已暂停状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_PAUSE 事件。这时,生命周期组件可以停止在组件未位于前台时无需运行的任何功能。如果 Activity 及时恢复,系统将再次调用 onResume() 回调。如果 Activity 从“已暂停”状态返回“已恢复”状态,系统会让 Activity 实例继续驻留在内存中,并会在系统调用 onResume() 时重新调用该实例。在这种情况下,您无需重新初始化在任何回调方法导致 Activity 进入“已恢复”状态期间创建的组件。
@Override
protected void onPause() {
super.onPause();
}
不管是哪种系统,此状态下不可交互,仍可能可见。 5.不可见。HarmonyOS Page不再对用户可见,系统将调用此回调通知开发者用户进行相应的资源释放,此后Page进入BACKGROUND状态。开发者应该在此回调中释放Page不可见时无用的资源,或在此回调中执行较为耗时的状态保存操作。
@Override
protected void onBackground() {
super.onBackground();
}
Android Activity 不再对用户可见,说明其已进入“已停止”状态,因此系统将调用 onStop() 回调。例如,当新启动的 Activity 覆盖整个屏幕时,可能会发生这种情况。如果 Activity 已结束运行并即将终止,系统还可以调用 onStop()。当 Activity 进入已停止状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_STOP 事件。这时,生命周期组件可以停止在组件未显示在屏幕上时无需运行的任何功能。在 onStop() 方法中,应用应释放或调整在应用对用户不可见时的无用资源。
@Override
protected void onStart() {
super.onStart();
}
6.重生。HarmonyOS 处于BACKGROUND状态的Page仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此Page),系统将先调用onForeground()回调通知开发者,而后Page的生命周期状态回到INACTIVE状态。开发者应当在此回调中重新申请在onBackground()中释放的资源,最后Page的生命周期状态进一步回到ACTIVE状态,系统将通过onActive()回调通知开发者用户。
@Override
protected void onForeground(Intent intent) {
super.onForeground(intent);
}
Android 用户快速返回,在Activity未被杀死的情况下,会调用onRestart(),然后调用onStart(),进入可见状态,再调用onResume(),进入交互状态,用户进行相关操作。
@Override
protected void onRestart() {
super.onRestart();
}
7.销毁。HarmonyOS 系统将要销毁Page时,将会触发onStop(),通知用户进行系统资源的释放。所有已实例化的AbilitySlice将联动销毁,而不仅是处于前台的
AbilitySlice。
@Override
protected void onStop() {
super.onStop();
}
Android 销毁 Ativity 之前,系统会先调用 onDestroy()。这时,生命周期组件可以在 Activity 被销毁之前清理所需的任何数据,释放所有资源。
@Override
protected void onDestroy() {
super.onDestroy();
}
小不同
1.配置文件。Ability相关注册需要在config.json中注册。
{
"module": {
...
"abilities": [
{
...
"type": "page"
...
}
]
...
}
...
}
Activity需要在AndroidManifest.xml中进行注册。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="...">
...
<application
...>
...
</application>
</manifest>
2.添加布局。
Ability:
@Override
public void onStart(Intent intent) {
super.onStart(intent);
// 加载XML布局作为根布局
super.setUIContent(ResourceTable.Layout_first_layout);
}
Activity:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main;);
}
说明
本文中HarmonyOS相关素材来自于HarmonyOS Developer 开发文档。
本文中Android相关素材来自于Android Developer 开发指南。
作者:VanGogh
来源:掘金
总结的很全面 学习了