HarmonyOS Rn容器内返回处理不合理,会退出APP

Rnoh版本:4.1.0.400

目前使用此rn版本,Rnoh的 DeviceEventManagerTurboModule 类的 invokeDefaultBackPressHandler 是直接杀死APP,如果把返回事件交给RN处理,就会直接退出APP

需要能够不直接杀死app,支持自定义返回逻辑,且不处理应该也是走onBackPress流程,而不是直接杀死APP

HarmonyOS
2024-08-23 09:57:06
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
鱼弦CTO
1

在 HarmonyOS 上使用 React Native 时,如果发现 ​​DeviceEventManagerTurboModule​​​ 类的 ​​invokeDefaultBackPressHandler​​ 方法直接杀死应用,这显然不是期望的行为。你可以通过自定义返回按键处理逻辑,来避免这种情况,并确保返回事件按照预期流程执行。

### 方案概述

你可以通过以下几种方法来解决这个问题:

  1. 拦截并处理返回按键事件:在 React Native 的 JavaScript 层面拦截返回按键事件,并根据需要决定如何处理。
  2. 自定义 invokeDefaultBackPressHandler​ 实现:在原生代码中自定义返回按键事件的处理逻辑,以替换默认的处理方法。
  3. 修改 ReactInstanceManager​ 或相关类的实现:确保返回按键事件不会直接导致应用退出,而是触发合适的生命周期方法。

### 方法 1:拦截并处理返回按键事件(JS层)

在 React Native 中,你可以使用 ​​BackHandler​​ 来监听和处理返回按键事件。

#### 示例代码:

import { BackHandler, Alert } from 'react-native';
import { useEffect } from 'react';

const MyReactComponent = () => {
    useEffect(() => {
        const backAction = () => {
            Alert.alert("Hold on!", "Are you sure you want to go back?", [
                {
                    text: "Cancel",
                    onPress: () => null,
                    style: "cancel"
                },
                {
                    text: "YES", 
                    onPress: () => BackHandler.exitApp()
                }
            ]);
            return true;
        };

        const backHandler = BackHandler.addEventListener(
            "hardwareBackPress",
            backAction
        );

        return () => backHandler.remove();
    }, []);

    return (
        // Your component UI here
    );
};

export default MyReactComponent;

### 方法 2:自定义 ​​invokeDefaultBackPressHandler​​ 实现(原生层)

如果你有控制原生代码的权限,可以自定义返回按键事件的处理逻辑。

#### 修改 ​​MainActivity.java​​ 或其他 Activity 文件:

import android.os.Bundle;
import ohos.aafwk.ability.Ability;
import com.facebook.react.ReactActivity;

public class MainActivity extends ReactActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 自定义初始化代码
    }

    @Override
    public void invokeDefaultOnBackPressed() {
        // 自定义返回按键处理逻辑
        // 不直接调用 super.onBackPressed() 以避免退出应用
        // 可以考虑显示一个对话框或提示用户
    }

    @Override
    public void onBackPressed() {
        // 检查是否需要自定义处理
        boolean handledByRn = false; // 根据需要修改此处逻辑
        if (handledByRn) {
            // 如果 RN 已经处理了返回事件,则不做进一步处理
            return;
        } else {
            // 否则调用自定义处理方法
            invokeDefaultOnBackPressed();
        }
    }
}

### 方法 3:确保 React Native 的生命周期与 HarmonyOS 一致

在某些情况下,你可能需要确保 React Native 生命周期方法正确映射到 HarmonyOS 生命周期方法上。

#### 确保 ​​ReactInstanceManager​​ 正确处理返回事件:

通常你应该确保你的 ​​ReactActivity​​ 或 ​​Ability​​ 类能够正确地与 ​​ReactInstanceManager​​ 通信,并且当返回按键按下时,它会触发正确的生命周期方法而不是杀死应用。

### 总结

通过以上三个方法,你可以有效地避免在 HarmonyOS 上 ​​invokeDefaultBackPressHandler​​ 导致应用直接退出的问题:

  1. 使用​​BackHandler​​ 在 JavaScript 层面拦截返回按键事件。
  2. 自定义​​invokeDefaultBackPressHandler​​ 以实现自己的返回按键处理逻辑。
  3. 确保 React Native 的生命周期方法正确映射到 HarmonyOS 的相应生命周期方法上。

这些方法应该能够帮助你在 HarmonyOS 上更好地管理 React Native 应用的返回按键处理。如果有更多问题或需要进一步的帮助,请随时提问!

分享
微博
QQ
微信
回复
2024-08-23 16:33:04
zxjiu

可以参考下面这种方式实现

BackHandler.addEventListener('hardwareBackPress', function () { 
  // TODO eg: TurboModule.back() 
  return true; 
});
分享
微博
QQ
微信
回复
2024-08-23 14:55:30
相关问题
HarmonyOS 退出app的方法
133浏览 • 1回复 待解决
HarmonyOS PushToken不合
239浏览 • 1回复 待解决
HarmonyOS 页面组件全屏怎么处理
281浏览 • 1回复 待解决
HarmonyOS 有没有方法直接退出APP
415浏览 • 1回复 待解决
docker容器的MySQL、Redis无法连接
3313浏览 • 1回复 待解决
HarmonyOS app如何禁用深色模式?
91浏览 • 1回复 待解决
HarmonyOS 如何实现APP全局弹窗
321浏览 • 1回复 待解决
HarmonyOS RN相关问题
327浏览 • 1回复 待解决
android12 app自启动+防止退出
3740浏览 • 0回复 待解决
如何获取应用信息以及彻底退出APP
275浏览 • 1回复 待解决
有谁知道如何强制退出app?
302浏览 • 1回复 待解决
如何获取应用信息以及彻底退出APP
375浏览 • 1回复 待解决