【问题标题】:How to access the activity from within a service in cordova plugins?如何从科尔多瓦插件的服务中访问活动?
【发布时间】:2019-07-29 01:25:53
【问题描述】:

我正在使用 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 Activity。我尝试过这样的事情:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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" /> 添加到plugin.xml 中的<feature> 定义中,以确保在应用启动时调用initialize()(请参阅Plugin Initialization and Lifetime):

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

    【讨论】:

    • 谢谢你,你救了我的命! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多