JEP 272: Platform-Specific Desktop Features | 平台特定的桌面功能
摘要
定义一个新的公共 API 来访问平台特定的桌面功能,例如与任务栏或 dock 交互,或监听系统或应用程序事件。
目标
在 JDK 9 之后的版本中,像 Mac OS X com.apple.eawt
包中的这些内部 API 将无法访问。这个 JEP 的目标是为这些不可访问的 API 提供合适的替代品,并引入相关的平台特定功能。我们计划在具有必要支持的平台上实现新功能。在可行的情况下,API 将被设计为跨平台,以便尽可能广泛地实现每个功能。正在删除 apple.applescript
类而没有提供任何替代品。
非目标
我们不打算为 JDK 8 中存在的所有内部 OS X API 提供直接替代品。具体来说,我们不会为 com.apple.concurrent
包提供替代方案。我们也不打算为我们提供替代方案的内部 API 保持兼容性。
描述
该 JEP 包含两个子任务:
提供公共 API 以替换 com.apple.{eawt,eio}
中的功能
这个子任务的目的是避免 OS X 开发人员失去功能。我们将为 JDK 内部的 com.apple.eawt
和 com.apple.eio
包中的 API 提供替代品。
在其他平台上提供类似的功能
除了 OS X 特定的功能外,在其他平台上也有类似的功能,包括 Windows 和 Linux:
登录 / 注销和屏幕锁定处理程序:提供系统登录 / 注销(或屏幕锁定 / 解锁)事件侦听器,允许应用程序在需要时启动持久任务或保存其状态。
任务栏 /dock 交互
请求用户关注:允许应用程序请求用户的关注,使用平台功能,如在任务栏中闪烁应用程序图标或在 dock 中弹起图标。
指示任务进度:在任务栏 /dock 中显示进度条或其他指示器。
动作快捷方式:提供可通过弹出菜单访问的动作快捷方式,例如 Windows 跳转列表。
这些功能的支持将由平台能力确定。
API
我们建议将这两个子任务的公共 API 添加到现有的 java.awt.Desktop
类中。目标支持的平台是 Mac OS X,Windows,Linux。
建议的 API 概述:
package java.awt;
public class Desktop {
/* ... */
/**
* 添加 {@link AppEventListener} 的子类型以侦听来自本地系统的通知。
*
* @param listener
* @see AppForegroundListener
* @see AppHiddenListener
* @see AppReOpenedListener
* @see AppScreenSleepListener
* @see AppSystemSleepListener
* @see AppUserSessionListener
*/
public void addAppEventListener(final AppEventListener listener) {}
/**
* 请求用户关注此应用程序(通常通过弹起 Dock 图标)。
* 重要请求将继续弹起 Dock 图标,直到激活应用程序为止。
*
*/
public void requestUserAttention(final boolean critical) {}
/**
* 将提供的 PopupMenu 的内容附加到应用程序的 Dock 图标。
*/
public void setDockMenu(final PopupMenu menu) {}
/**
* 将此应用程序的 Dock 图标更改为提供的图像。
*/
public void setDockIconImage(final Image image) {}
/**
* 在此应用程序的 Dock 图标上附加一个小型系统提供的徽章。通常是数字。
*/
public void setDockIconBadge(final String badge) {}
/**
* 在 dock 中显示或隐藏进度条或其他指示器。
*
* @see DockProgressState.NORMAL
* @see DockProgressState.PAUSED
* @see DockProgressState.ERROR
*
* @see #setDockProgressValue
*/
public void setDockProgressState(int state) {}
/**
* 将进度条的当前值设置为 {@code n}。
*/
public void setDockProgressValue(int n) {}
/**
* 测试当前平台是否支持某个功能。
*/
public boolean isSupportedFeature(Feature f) {}
/* ... */
}
测试
测试将仅限于编写使用新 API 的其他手动测试。测试需要检查新功能是否在预期支持它们的平台上受支持,并且在没有支持的平台上优雅地失败。