Как реализовать фоновую службу Android в NativeScript, ориентированную как на API уровня 26+, так и ниже - PullRequest
0 голосов
/ 17 октября 2019

Мне нужно реализовать фоновую службу в NativeScript, которая будет получать местоположение пользователя каждые x минут, отправлять запрос в мой API и, в зависимости от ответа, отправлять локальное уведомление.

Поэтому я начал искатьспособы реализовать это, что привело меня к этому NativeScript хранилище . Как указано в README:

В текущей реализации используется NotificationChannel, который был добавлен в API-уровень 26. Если вы хотите ориентироваться на более низкие уровни API, взгляните на более старую реализацию AlarmМенеджер по внедрению . Имейте в виду, что этот подход не поддерживается с API уровня 26 или новее из-за ограничений в ОС.

Мне нужно поддерживать Android 5.1+ (API Level 22+), поэтому новая реализацияне будет работать для меня, вместо этого я должен использовать более старую реализацию Alarm Manager, как уже упоминалось. Проблема в том, что, как видно из цитаты, этот подход не поддерживается с API уровня 26 +.

И, как все знают, Google заставляет новые приложения ориентироваться как минимум на API уровня 28. Итак, какя могу реализовать Фоновую службу, которая будет работать с API уровня 22 до 28?

1 Ответ

2 голосов
/ 17 октября 2019

Вы можете обратиться к примеру в плагине nativescript-geolocation , работающем для всех поддерживаемых версий Android.

     if (device.sdkVersion < "26") {
        @JavaProxy("com.nativescript.location.BackgroundService")
        class BackgroundService extends (<any>android).app.Service {
            constructor() {
                super();
                return global.__native(this);
            }
            onStartCommand(intent, flags, startId) {
                console.log('service onStartCommand');
                this.super.onStartCommand(intent, flags, startId);
                return android.app.Service.START_STICKY;
            }
            onCreate() {
                console.log('service onCreate');
                _startWatch();
            }
            onBind(intent) {
                console.log('service onBind');
            }
            onUnbind(intent) {
                console.log('service onUnbind');
            }
            onDestroy() {
                console.log('service onDestroy');
                _clearWatch();
            }
        }
        return BackgroundService;
    } else {
        @JavaProxy("com.nativescript.location.BackgroundService26")
        class BackgroundService26 extends (<any>android.app).job.JobService {
            constructor() {
                super();
                return global.__native(this);
            }
            onStartJob(): boolean {
                console.log('service onStartJob');
                _startWatch();
                return true;
            }
            onStopJob(jobParameters: any): boolean {
                console.log('service onStopJob');
                this.jobFinished(jobParameters, false);
                _clearWatch();
                return false;
            }
        }
        return BackgroundService26;
    }
...