安装推送插件时我的自定义 Cordova 插件的粘滞通知终止
Sticky Notification of my Custom Cordova Plugin kill when installing push plugin
我写的是自定义插件,它只对处理粘性通知插件事件起作用。
我遇到的工作场景和问题:-
- 在演示 corodva 应用程序中安装时它工作正常并且功能也像关闭应用程序后一样工作正常由自定义插件创建的粘性通知出现在 locak 屏幕和通知栏上。
- 但是当尝试在已安装自定义插件的演示应用程序中安装 phonegap 推送插件时。在该粘性通知从通知 bar.When 中获取 clear/remove/disappear 之后,用户关闭了该应用程序。
当我看到 android 的 Phonegap Push 插件源代码时,我在插件中写了 NotifcationManger.cancelAll()。
不明白为什么会这样?
在下面添加我的粘性通知插件代码:-
public class StickyNotificationPlugin extends CordovaPlugin {
private static final String START_NOTIFICATION = "START";
private static final String STOP_NOTIFICATION = "STOP";
private Notification myNotication;
int intNotificationId = 11111;
private NotificationManager manager;
private SharedPreferences objSharedPreferences;
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
objSharedPreferences = this.cordova.getActivity().getSharedPreferences("My_Plugin_Prefs", Context.MODE_PRIVATE);
System.out.println("Final in Plugin Action==>" + action);
manager = (NotificationManager) this.cordova.getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
if (START_NOTIFICATION.equals(action)) {
SharedPreferences.Editor objEditor = objSharedPreferences.edit();
objEditor.putString("plugin_url", args.getString(0));
objEditor.putString("plugin_token", args.getString(1));
objEditor.putString("plugin_user_id", args.getString(2));
objEditor.putBoolean("plugin_status", true);
objEditor.commit();
Notify();
} else if (STOP_NOTIFICATION.equals(action)) {
SharedPreferences.Editor objEditor = objSharedPreferences.edit();
objEditor.putString("plugin_url", "");
objEditor.putString("plugin_token", "");
objEditor.putString("plugin_user_id", "");
objEditor.putBoolean("plugin_status", false);
objEditor.putLong("time", 0);
objEditor.commit();
manager.cancel(intNotificationId);
}
return true;
}
private void Notify() {
Context objContext = this.cordova.getActivity();
Intent objIntent = new Intent(objContext, ApiCallServeice.class);
PendingIntent pi = PendingIntent.getService(objContext, intNotificationId, objIntent, PendingIntent.FLAG_CANCEL_CURRENT);
RemoteViews objRemoteViews = new RemoteViews(objContext.getApplicationContext().getPackageName(), R.layout.sticky_notification);
objRemoteViews.setOnClickPendingIntent(R.id.btn_notification, pi);
Notification.Builder builder = new Notification.Builder(objContext);
builder.setAutoCancel(false);
builder.setSmallIcon(objContext.getApplicationInfo().icon);
objRemoteViews.setImageViewResource(R.id.img_icon, objContext.getApplicationInfo().icon);
builder.setOngoing(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
}
builder.setContent(objRemoteViews);
builder.build();
myNotication = builder.getNotification();
manager.notify(intNotificationId, myNotication);
}}
您的问题将通过删除按下主页按钮后取消通知的两行来解决 -
这两行是在PushPlugin.java文件的onPause()方法中找到的。
final NotificationManager notificationManager = (NotificationManager) cordova.getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
我写的是自定义插件,它只对处理粘性通知插件事件起作用。
我遇到的工作场景和问题:-
- 在演示 corodva 应用程序中安装时它工作正常并且功能也像关闭应用程序后一样工作正常由自定义插件创建的粘性通知出现在 locak 屏幕和通知栏上。
- 但是当尝试在已安装自定义插件的演示应用程序中安装 phonegap 推送插件时。在该粘性通知从通知 bar.When 中获取 clear/remove/disappear 之后,用户关闭了该应用程序。
当我看到 android 的 Phonegap Push 插件源代码时,我在插件中写了 NotifcationManger.cancelAll()。
不明白为什么会这样?
在下面添加我的粘性通知插件代码:-
public class StickyNotificationPlugin extends CordovaPlugin {
private static final String START_NOTIFICATION = "START";
private static final String STOP_NOTIFICATION = "STOP";
private Notification myNotication;
int intNotificationId = 11111;
private NotificationManager manager;
private SharedPreferences objSharedPreferences;
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
objSharedPreferences = this.cordova.getActivity().getSharedPreferences("My_Plugin_Prefs", Context.MODE_PRIVATE);
System.out.println("Final in Plugin Action==>" + action);
manager = (NotificationManager) this.cordova.getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
if (START_NOTIFICATION.equals(action)) {
SharedPreferences.Editor objEditor = objSharedPreferences.edit();
objEditor.putString("plugin_url", args.getString(0));
objEditor.putString("plugin_token", args.getString(1));
objEditor.putString("plugin_user_id", args.getString(2));
objEditor.putBoolean("plugin_status", true);
objEditor.commit();
Notify();
} else if (STOP_NOTIFICATION.equals(action)) {
SharedPreferences.Editor objEditor = objSharedPreferences.edit();
objEditor.putString("plugin_url", "");
objEditor.putString("plugin_token", "");
objEditor.putString("plugin_user_id", "");
objEditor.putBoolean("plugin_status", false);
objEditor.putLong("time", 0);
objEditor.commit();
manager.cancel(intNotificationId);
}
return true;
}
private void Notify() {
Context objContext = this.cordova.getActivity();
Intent objIntent = new Intent(objContext, ApiCallServeice.class);
PendingIntent pi = PendingIntent.getService(objContext, intNotificationId, objIntent, PendingIntent.FLAG_CANCEL_CURRENT);
RemoteViews objRemoteViews = new RemoteViews(objContext.getApplicationContext().getPackageName(), R.layout.sticky_notification);
objRemoteViews.setOnClickPendingIntent(R.id.btn_notification, pi);
Notification.Builder builder = new Notification.Builder(objContext);
builder.setAutoCancel(false);
builder.setSmallIcon(objContext.getApplicationInfo().icon);
objRemoteViews.setImageViewResource(R.id.img_icon, objContext.getApplicationInfo().icon);
builder.setOngoing(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
}
builder.setContent(objRemoteViews);
builder.build();
myNotication = builder.getNotification();
manager.notify(intNotificationId, myNotication);
}}
您的问题将通过删除按下主页按钮后取消通知的两行来解决 -
这两行是在PushPlugin.java文件的onPause()方法中找到的。
final NotificationManager notificationManager = (NotificationManager) cordova.getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();