0

我的 NativeScript 应用程序在第一次启动时出现问题。我知道存在“冷启动”,但每次单击设备上的主页按钮然后返回应用程序时,活动都会重复。这是一个大错误(内存泄漏、重复请求、奇怪的 UI 体验,因为用户单击后退按钮并看到相同的页面)。

据我所知,这是一个旧的 android 错误。第一个提到的关于这个的错误是从 2009 年开始的,所以我不能指望谷歌会很快修复它;)

https://issuetracker.google.com/issues/64108432

https://discourse.nativescript.org/t/kill-app-when-pushed-to-background/3560

我想要做的是在应用程序第一次启动时调用“后退按钮”,因为在此之后,应用程序可以正常工作。我发现我可以使用 android.foregroundActivity.finish(),但是当我尝试这样做时,我收到一条错误消息

TypeError: Cannot read property 'finish' of undefined

试过:

var app = require('application');
app.android.foregroundActivity.finish();

import { android } from 'tns-core-modules/application';
android.foregroundActivity.finish();

找到了foregroundActivity,但没有找到finish()。我也试过 android.os.Process.killProcess(android.os.Process.myPid()); 但没有像'android.os'这样的属性:/

知道如何正确使用它吗?或者也许有另一种选择来处理这个问题?整个 main.tns.ts 文件如下:

import { hasKey, setBoolean } from 'tns-core-modules/application-settings';
import { platformNativeScriptDynamic } from 'nativescript-angular/platform';
import { AppOptions } from 'nativescript-angular/platform-common';
import {
  on as applicationOn,
  off as applicationOff,
  exitEvent,
  launchEvent,
  ApplicationEventData,
  android,
} from 'tns-core-modules/application';
import { enableProdMode } from '@angular/core';
import { AppModule } from '~/app/app.module';

const firebase = require('nativescript-plugin-firebase');

let isAppInitialized = false;
let options: AppOptions = {};

function launchListener(args: ApplicationEventData) {
  if (args.android) {
    handleColdStart(args.android);
    tryToInitializeFirebase();
  }
}

function handleColdStart(context) {
  if (!hasKey('isFirstStart')) {
    setBoolean('isFirstStart', true);
    android.foregroundActivity.finish();
  }
}

function tryToInitializeFirebase() {
  if (!isAppInitialized) {
    setTimeout(() => {
      firebase
        .init({})
        .then((instance) => {
          console.log('firebase.init donessse');
        })
        .catch((err) => {
          console.log('Firebase init error: ' + err);
        });
    }, 1000);
    isAppInitialized = true;
  }
}

function exitListener(args: ApplicationEventData) {
  if (args.android) {
    applicationOff(launchEvent, launchListener);
  }
}

applicationOn(launchEvent, launchListener);
applicationOn(exitEvent, exitListener);

if (module['hot']) {
  options.hmrOptions = {
    moduleTypeFactory: () => AppModule,
    livesyncCallback: (platformReboot) => {
      setTimeout(platformReboot, 0);
    },
  };

  module['hot'].accept(['./app/app.module'], () => {
    global['hmrRefresh']();
  });
}

enableProdMode();
platformNativeScriptDynamic().bootstrapModule(AppModule);

编辑:我在操场上创建了一个项目,有趣的是,如果你通过操场(在线预览)运行这个项目,它工作正常。但是,如果您下载该项目,然后使用 tns run android 运行该项目(使用 tns preview 它也可以正常工作),您将看到我在说什么:

https://play.nativescript.org/?template=play-ng&id=MxBIfX&v=2

我录制了视频: https: //www.youtube.com/embed/DJETWEd3EaY

我发现https://www.nativescript.org/blog/nativescript-preview和“由于预览命令跳过了构建本机应用程序的步骤,因此通常需要重建本机应用程序的任何东西都是限制所在。 ”所以也许这就是在线预览(tns 预览)工作方式不同的原因。

4

0 回答 0