如何在Native API中实现API级别26以上的Android后台服务

时间:2019-10-17 01:09:46

标签: android nativescript background-service

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

因此,我开始寻找实现此方法的方法,这使我进入了NativeScript repository。如自述文件所述:

  

当前实现使用API​​级别26中添加的NotificationChannel。如果要定位较低的API级别,请查看较旧的实现Alarm Manager Implementation。请记住,由于操作系统的限制,API Level 26或更高版本不支持此方法。

我需要支持Android 5.1+(API级别22+),因此新的实现对我不起作用,相反,我应该使用提到的较旧的Alarm Manager实现。问题是,正如您在引文中所看到的,API Level 26+不支持此方法。

众所周知,Google强制新应用程序至少针对API级别28。那么,我如何实现可在API级别22到28之间运行的后台服务?

1 个答案:

答案 0 :(得分:2)

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