如何从NativeScript-Angular App中的android后台服务访问服务和数据?

时间:2019-12-07 22:27:05

标签: android angular nativescript nativescript-angular

我有一个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);

如何从主要任务访问本地数据,以及如何与主要任务的角度服务进行交互?

0 个答案:

没有答案