从cordova插件调用后台服务方法

问题描述 投票:0回答:1

我希望能够启动服务,或者在后台服务上运行类,但我想访问类我的cordova插件。

目前,我有类似下面的东西,这不是很好,但它的工作原理。但是,如果用户将应用程序推到后面,或者关闭应用程序(而不是服务),那么它就会停止运行。

当用户关闭UI或退出应用程序时,我需要MyHttpServer继续运行。

public class MyCordovaPlugin extends CordovaPlugin {

    private static final String TAG = "MyCordovaPlugin";

    MyHttpServer httpServer;

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (httpServer == null) {
            httpServer = new MyHttpServer();
        }

        if (action.equals("get-service-stats")) {
            callbackContext.success(httpServer.getStats());
        }
    }
}

我知道要在后台运行服务,我可以使用下面的代码,我现在做的其他东西,它的工作原理,但我无法从cordova访问该实例。

// stop just encase its already started
context.stopService(new Intent(context, HttpServerService.class));

// start service
context.startService(new Intent(context, HttpServerService.class));

是否有一种特殊的方式来实现cordova插件和adnroid后台服务之间的通信?让我们说这个例子,MyHttpServer作为一种方法称为getStats,如果MyHttpServer在自己的Service中运行,我怎么能在我的cordova插件中调用它。

所以像这样的东西,这是插件

public class MyCordovaPlugin extends CordovaPlugin {

    private static final String TAG = "MyCordovaPlugin";

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals("get-service-stats")) {
            // CALL HttpServerService.GETSTATS METHOD HERE
        }
    }
}

这是后台服务器

public class HttpServerService extends Service {
    private static final String TAG = "HttpServerService";
    private MyHttpServer httpServer;
    private Context context;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        context = this.getApplicationContext();
        httpServer = new MyHttpServer();
        httpServer.start();

        return Service.START_STICKY;
    }

    public string getStats() {
         return httpServer.getStats();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        if (httpServer != null)
            httpServer.stop();

        super.onDestroy();
    }
}
java android cordova ionic-framework phonegap
1个回答
0
投票

是否有一种特殊的方式来实现cordova插件和adnroid后台服务之间的通信?让我们说这个例子MyHttpServer作为一个方法就叫做getStats,如果MyHttpServer在自己的服务中运行,怎么能在我的cordova插件中调用它

您可以使用this Developers guide实现活动和服务之间的绑定。通过这样做,您将能够从活动中调用服务的方法。

目前,我有类似下面的东西,这不是很好,但它的工作原理。但是,如果用户将应用程序推到后面,或者关闭应用程序(而不是服务),那么它就会停止运行。

如果您希望它运行,您的服务必须是前台服务,即使您的活动将被停止。您应该看到this example实现前台服务。你必须知道背景执行的Oreo has some limitations

对不起我的英语不好

© www.soinside.com 2019 - 2024. All rights reserved.