我有一个NativeScript-Angular应用程序,该应用程序从API获取数据。为了收集数据,存在具有不同(api)终结点的不同(角度)服务。一种数据类型非常重要,因此即使应用程序处于后台,应用程序也必须在很短的间隔(拉动)中查找新数据。这项任务的正确选择似乎是 android后台服务。
一段时间后,我找到了一个野兽练习或示例,发现了nativescript-geolocation插件及其演示+ background-service.ts和问题#157,其中有一个角度示例attached。在这两个示例以及其他几个示例中,主要动作是console.log(...)
,对于第一次尝试来说不错,但对于真正的应用程序则不是。
我想使用现有服务从API获取和处理数据。我尝试了 Bass How to use (angular) HTTP Client in native background service - NativeScript中的方法,但未完全成功。注入程序为我提供了我的服务实例,但仅提供了一次,而不是主要任务中的实例。这样一来,我就无法访问所有由应用在启动时初始化的本地应用数据。
按照我的示例运行android后台服务并输出一个计数器。为了进行测试,我从ExampleService调用length()
方法,在这种情况下,该方法始终返回0,因为在此实例中,数组从ExampleService返回为空。在ExampleService的主要实例中,数组具有条目。
AndroidMainifest.xml-定义android服务
<service android:name="com.tns.ExampleBackgroundService"
android:exported="false">
</service>
ExampleBackgroundService.ts
import { Injectable, Injector } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DatabaseService } from '~/services/database.service';
import { MessageService } from '~/services/message.service';
@JavaProxy('com.tns.ExampleBackgroundService')
// @ts-ignore TS2304
export class ExampleBackgroundService extends (<any>android).app.Service {
protected injector: Injector;
protected exampleService: ExampleService;
protected id: number;
constructor() {
super();
return global.__native(this);
}
onCreate() {
this.injector = Injector.create({
providers:
[
{provide: HttpClient, useClass: HttpClient, deps: []},
{provide: DatabaseService, useClass: DatabaseService, deps: []},
{provide: MessageService, useClass: MessageService, deps: []},
{
provide: ExampleService,
useClass: ExampleService,
deps: [HttpClient, DatabaseService, MessageService]
},
]
});
}
onStartCommand(intent, flags, startId) {
this.super.onStartCommand(intent, flags, startId);
this.exampleService = this.injector.get(ExampleService);
let count = 0;
// @ts-ignore T2322
this.id = setInterval(() => {
console.log('count: ', count++, this.exampleService.length());
}, 1000
);
// @ts-ignore TS2304
return (<any>android).app.Service.START_STICKY;
}
}
启动后台服务
const utils = require('tns-core-modules/utils/utils');
// ...
let context = utils.ad.getApplicationContext();
// @ts-ignore
let intent = new (<any>android).content.Intent(context, ExampleBackgroundService.class);
context.startService(intent);
如何从主要任务访问本地数据,以及如何与主要任务的角度服务进行交互?