我的 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 预览)工作方式不同的原因。