我如何在 NativeScript 中实现 Android 后台服务同时针对 API 级别 26+ 及以下

How can I implement Android Background Service in NativeScript targeting both API Level 26+ and below

我需要在 NativeScript 中实现一个后台服务,它将每 x 分钟获取一次用户位置,向我的 API 发出请求,并根据响应发出本地通知。

所以我开始寻找实现它的方法,这让我想到了这个 NativeScript repository。如 README 中所述:

The current implementation utilizes the NotificationChannel, which was added in API Level 26. If you want to target lower API Levels, take a look at the older implementation Alarm Manager Implementation. Have in mind, that this approaches is not supported with API Level 26 or newer due to limitations in the OS.

我需要支持 Android 5.1+(API Level 22+),所以新的实现对我不起作用,相反,我应该使用前面提到的旧的 Alarm Manager 实现。问题是,正如您在引用中看到的那样,API Level 26+ 不支持这种方法。

众所周知,Google 强制新应用程序至少以 API 级别 28 为目标。那么,我如何实现一个从 API 级别运行的后台服务22 到 28?

您可以参考 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;
    }