react native 退出时保持后台运行(android)

     在android app 的开发的开发过程中,我们需要监听android的返回键,退出active界面。

    有时为了,能够给用户更好的体验,需要app退出界面后,app在后台运行。(当然这可能还需要实现 常驻内存,可以点击这里查看 常驻内存实现)

   react native 提供backAndroid api,可以我们使用后发现。该api的退出,是结束进程,也就是完全退出。

 于是查看该api,发现backAndroid api在ReactActivity里面的实现,最后默认会调用 invokeDefaultOnBackPressed 这个方法。

  那我们想要实现在根路由里面,退出到后台运行,而不是关闭路由。该怎么解决呢?

 这里我们只需在MainActivity里面重写invokeDefaultOnBackPressed方法就行。

为了方便大家copy,我贴出重写后的代码。我想对于react native android 着急的同学可以看看。

public void invokeDefaultOnBackPressed() {
    PackageManager pm = getPackageManager();
    ResolveInfo homeInfo =
     pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), 0);
     ActivityInfo ai = homeInfo.activityInfo;
    Intent startIntent = new Intent(Intent.ACTION_MAIN);
    startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    startIntent.setComponent(new ComponentName(ai.packageName, ai.name));
    startActivity(startIntent);
}
具体思路就是在退出前,将当期的Intent 保存。

或者这样重写invokeDefaultOnBackPressed方法,当然这样重写的话,只会在根路由退出才起作用

public void invokeDefaultOnBackPressed() {
    moveTaskToBack(false);
}



当然要实现根路由退出你得在根路由实现以下方法。 注意backandroid 返回false 会结束应用运行,所以最后返回true

removeBackAndroidListener=()=> {
    if (Platform.OS === 'android') {
        BackAndroid.removeEventListener('hardwareBackPress', () => {
        });
    }
};
addBackAndroidListener=(navigator)=> {
    if (Platform.OS === 'android') {
        BackAndroid.addEventListener('hardwareBackPress',() => {
            return this._onBackAndroid(navigator);
        });
    }
};

_onBackAndroid=(navigator)=> {
    if (!navigator) return false;
    const routers = navigator.getCurrentRoutes();
    // 当前页面不为root页面时的处理
    if (routers.length > 1) {
        const top = routers[routers.length - 1];
        if (top.ignoreBack || top.component.ignoreBack) {
            // 路由或组件上决定这个界面忽略back            return true;
        }
        const handleBack = top.handleBack || top.component.handleBack;
        if (handleBack) {
            // 路由或组件上决定这个界面自行处理back            return handleBack();
        }
        // 默认行为: 退出当前界面。
        navigator.pop();
        return true;
    }
    // 当前页面为root页面时的处理
    if (this.lastBackPressed ) {
        //最后退出到后台运行。
        BackAndroid.exitApp();
        return true;
    }
    this.lastBackPressed = Date.now();
   // ToastAndroid.show(I18n.t('text.doubleAgain'),ToastAndroid.SHORT);
    return true;
};


你可能感兴趣的:(react,native)