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

#### 问题现象

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

#### 背景知识

*   startAbility：启动一个UIAbility，实现应用间跳转。
*   aboutToAppear：aboutToAppear函数在创建自定义组件的新实例后，在执行其build()函数之前执行。

#### 问题定位

通过搜索代码中的关键词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表示完整体验模式。