如何从 cordova 插件的服务中访问 activity?
How to access the activity from within a service in cordova plugins?
我正在使用 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);
但是由于插件没有扩展 activity(它扩展了 CordovaPlugin),这似乎不起作用。我可以从插件中访问 activity,但我似乎无法将 activity 传递给服务。任何帮助将不胜感激:).
您可以将您的插件实例公开为 public class 属性,从而从中访问 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 静态 属性 引用它,类似这样:
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>
我正在使用 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);
但是由于插件没有扩展 activity(它扩展了 CordovaPlugin),这似乎不起作用。我可以从插件中访问 activity,但我似乎无法将 activity 传递给服务。任何帮助将不胜感激:).
您可以将您的插件实例公开为 public class 属性,从而从中访问 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 静态 属性 引用它,类似这样:
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>