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

来源:互联网 发布:公需科目大数据登录 编辑:程序博客网 时间:2024/06/08 03:14

     在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;};


0 0
原创粉丝点击