关于在Eclipse RCP插件项目中使用Mylyn通知的技术咨询
Hey there! I’ve worked with Mylyn’s notification framework in Eclipse RCP projects before, so let me break down the core concepts and walk you through a step-by-step implementation guide.
Core Concepts to Understand First
Mylyn’s notification system revolves around a few key components that work together to handle notification creation, delivery, and display:
INotificationService: The central service that manages registration of notification sinks, action providers, and distributes notifications to the appropriate handlers.INotification: The model representing a single notification, holding details like title, message, priority, and source ID.NotificationSink: Responsible for rendering notifications (e.g., pop-up alerts, status bar updates). Mylyn provides default sinks, but you can create custom ones.INotificationActionProvider: Adds actionable buttons (like "Open") to notifications, letting users interact with the alert.
Step 1: Add Required Dependencies
First, update your plugin’s MANIFEST.MF to include the necessary Mylyn bundles:
Require-Bundle: org.eclipse.mylyn.commons.notifications;bundle-version="4.0.0", org.eclipse.mylyn.commons.ui;bundle-version="4.0.0"
(Note: Use the latest compatible version for your Eclipse RCP target platform.)
Step 2: Retrieve the Notification Service
Access the INotificationService via Eclipse’s service registry. For UI-related code:
INotificationService notificationService = PlatformUI.getWorkbench().getService(INotificationService.class);
If you’re working in a non-UI thread, use the platform-wide service:
INotificationService notificationService = Platform.getService(INotificationService.class);
Step 3: Create and Send a Basic Notification
You can either implement INotification directly or extend AbstractNotification for a simpler setup. Here’s a quick example:
// Create a custom notification INotification sampleNotification = new AbstractNotification( "com.your.plugin.notification.type.sample", // Unique notification type ID "New Update Available", // Notification title "A new version of your plugin is ready to install." // Notification message ) { @Override public String getSourceId() { return "com.your.plugin.id"; // Your plugin's ID as the source identifier } @Override public NotificationPriority getPriority() { return NotificationPriority.HIGH; // Options: LOW, NORMAL, HIGH } }; // Send the notification to the service notificationService.notify(sampleNotification);
By default, this will trigger Mylyn’s standard pop-up notification in the Eclipse workbench.
Step 4: Customize Notification Display
If the default pop-up isn’t enough, create a custom NotificationSink to handle how notifications are presented:
public class CustomDialogNotificationSink implements INotificationSink { @Override public void notify(INotification notification, NotificationEvent event) { // Run UI operations on the UI thread Display.getDefault().asyncExec(() -> { Shell activeShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); MessageDialog.openInformation( activeShell, notification.getTitle(), notification.getMessage() ); }); } @Override public boolean isEnabled(INotification notification) { // Only handle notifications from your plugin return "com.your.plugin.id".equals(notification.getSourceId()); } }
Then register your sink with the service:
CustomDialogNotificationSink customSink = new CustomDialogNotificationSink(); notificationService.addNotificationSink(customSink);
Step 5: Add Actionable Buttons to Notifications
To let users interact with notifications (e.g., open a settings page), implement INotificationActionProvider:
public class NotificationActionProvider implements INotificationActionProvider { @Override public Collection<IAction> getActions(INotification notification) { List<IAction> actions = new ArrayList<>(); IAction openSettingsAction = new Action("Open Plugin Settings") { @Override public void run() { Display.getDefault().asyncExec(() -> { try { // Open your plugin's preference page PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getPreferenceManager().showPreferencePage("com.your.plugin.preferences.page"); } catch (WorkbenchException e) { e.printStackTrace(); } }); } }; actions.add(openSettingsAction); return actions; } }
Register the provider with the service:
notificationService.addNotificationActionProvider(new NotificationActionProvider());
Best Practices & Key Tips
- Thread Safety: Always wrap UI-related notification logic in
Display.getDefault().asyncExec()to avoid cross-thread exceptions. - Cleanup: When your plugin stops, remove registered sinks and action providers to prevent memory leaks:
notificationService.removeNotificationSink(customSink); notificationService.removeNotificationActionProvider(actionProvider); - Preference Integration: Let users customize notification behavior by implementing
INotificationPreferenceProvider, which integrates with Eclipse’s preference system. - Notification Types: Use unique notification type IDs to let users filter or disable specific notification categories in preferences.
内容的提问来源于stack exchange,提问作者Ganesh Rao B

