目录

输入法应用打开时,自动跳转至系统设置

问题现象

当用户打开输入法应用时,应用会自动跳转至系统设置中的输入法管理界面,影响用户体验。

背景知识

问题定位

通过搜索代码中的关键词startAbility,排查跳转逻辑是否存在异常。具体定位到开屏页的aboutToAppear函数中,存在一条直接跳转至系统设置的代码,导致应用启动后立即跳转,而非按预期显示开屏页。

aboutToAppear(): void {
  let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext
  context.startAbility({
    deviceId: "",
    bundleName: "com.huawei.hmos.settings",
    abilityName: "com.huawei.hmos.settings.MainAbility",
    uri: "set_input"
  })
}

分析结论

由于aboutToAppear在组件初始化阶段就会触发,aboutToAppear函数中调用startAbility接口跳转系统设置,未做判断或者弹窗提示,因此该跳转逻辑会在应用启动时自动执行,导致用户无法看到开屏页,而是直接跳转至系统设置页面。

修改建议

为提升用户体验,建议将跳转逻辑从自动跳转改为用户主动触发的方式,例如通过弹窗提示用户是否需要前往设置页面。示例代码如下:

import { common } from '@kit.AbilityKit';
import { TipsDialog } from '@kit.ArkUI';

@Entry
@Component
struct JumpSetting{
  dialogControllerImage: CustomDialogController = new CustomDialogController({
    builder: TipsDialog({
      content: '尚未设置本应用为默认输入法,是否前往设置?',
      primaryButton: {
        value: '取消',
        action: () => {
          console.info('Callback when the first button is clicked');
        },
      },
      secondaryButton: {
        value: '确认',
        action: () => {

          let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
          context.startAbility({
            deviceId: '',
            bundleName: 'com.huawei.hmos.settings',
            abilityName: 'com.huawei.hmos.settings.MainAbility',
            uri: 'set_input'
          });
        }
      },
    }),
  });

  aboutToAppear(): void {
    this.dialogControllerImage.open();
  }

  build() {
    Column(){
      Row(){
        Text('输入法应用样例')
          .fontSize(40)
      }
      .width('100%')
      .height('92%')
      .justifyContent(FlexAlign.Center)
      Row(){
        Column() {
          Text('样式')
        }
        .width('50%')
        Column() {
          Text('我的')
        }
        .width('50%')
      }
      .width('100%')
      .height('8%')
    }
    .padding({bottom:20})
    .width('100%')
    .height('100%')
  }
}

常见FAQ

Q:如何获取当前输入法?

A:可以通过inputMethod.getCurrentInputMethod获取当前输入法。

Q:如何查询输入法的启用状态?

A:可以通过getInputMethodState查询输入法的启用状态。
  • 返回EnabledState.DISABLED表示未启用。
  • 返回EnabledState.BASIC_MODE表示基础模式。
  • 返回EnabledState.FULL_EXPERIENCE_MODE表示完整体验模式。