如何在Cordova插件的服务中访问活动?

时间:2019-03-07 08:19:12

标签: java android cordova android-activity android-service

我正在使用Cordova构建应用程序,现在我专注于后台服务。我需要该通知服务并定期更新它们,该服务已经运行良好。当用户单击通知时,它应该打开应用程序,例如与Spotify一样。现在有了一个独立的应用程序,我通常会这样做:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
PendingIntent contentIntent = PendingIntent.getActivity(this,0, 
intent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, myChannelID)
.setContentIntent(contentIntent);

然后构建通知,依此类推。问题是,我无法从服务中访问Cordova活动。我已经尝试过这样的事情:

Intent intent = new Intent(this, MyPlugin.class);

但是由于该插件不扩展活动(它扩展了CordovaPlugin),所以这似乎不起作用。我可以从插件中访问活动,但似乎无法将活动传递给服务。任何帮助将不胜感激:)。

1 个答案:

答案 0 :(得分:0)

您可以将插件实例公开为公共类属性,从而从中访问Cordova活动:

public class MyPlugin extends CordovaPlugin{
    public static MyPlugin instance = null;
    static CordovaWebView cordovaWebView;
    static CordovaInterface cordovaInterface;

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);

        instance = this;
        cordovaWebView = webView;
        cordovaInterface = cordova;
    }

    @Override
    public void onDestroy() {
        instance = null;
    }
}

然后您的服务可以通过该公共静态属性来引用它,如下所示:

public class MyService {
    public static void myMethod(){
        if(MyPlugin.instance != null){
            Activity cordovaActivity = MyPlugin.instance.cordovaInterface.getActivity();
            Context applicationContext = cordovaActivity.getApplicationContext();

            Intent intent = new Intent(applicationContext, cordovaActivity.getClass());
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            PendingIntent contentIntent = PendingIntent.getActivity(applicationContext,0, intent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(applicationContext, myChannelID).setContentIntent(contentIntent);
        }
    }
}

请确保将<param name="onload" value="true" />添加到<feature>中的plugin.xml定义中,以确保在应用启动时调用initialize()(请参阅Plugin Initialization and Lifetime):< / p>

<feature name="MyPlugin">
    <param name="android-package" value="cordova.plugin.MyPlugin" />
    <param name="onload" value="true" />
</feature>