我到处搜索过,但无法在SDK或Google上找到关于如何执行此操作的任何内容。我知道这是可能的,因为所有的自定义发射器都可以通过按钮按钮(LauncherPro,ADW等)来完成。如何以编程方式在Android中打开/关闭通知?
谢谢。
我到处搜索过,但无法在SDK或Google上找到关于如何执行此操作的任何内容。我知道这是可能的,因为所有的自定义发射器都可以通过按钮按钮(LauncherPro,ADW等)来完成。如何以编程方式在Android中打开/关闭通知?
谢谢。
的answer from Ashwin作品的Android版本低于4.2.2(即低于17版)。在4.2.2中,“expand”方法更改为“expandNotificationsPanel”。如果您不使用4.2.2及更高版本的方法名称,您将得到一个空指针异常。因此,代码应该是:
Object sbservice = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method showsb;
if (Build.VERSION.SDK_INT >= 17) {
showsb = statusbarManager.getMethod("expandNotificationsPanel");
}
else {
showsb = statusbarManager.getMethod("expand");
}
showsb.invoke(sbservice);
和适当的权限应加AndroidManifest
。
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
显然,这是不公布的API的一部分,所以这不能保证在今后的工作中,很多人会建议对这样做。
下面是从Android的Launcher
的showNotifications方法:
private void showNotifications() {
final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
if (statusBar != null) {
statusBar.expand();
}
}
(其中,因为罗比表示,是 “状态栏” 系统服务)。
这不是Android SDK的一部分。 – CommonsWare 2011-02-17 14:24:28
这不起作用,因为公共API – user496854 2011-02-17 15:26:43
中没有StatusBarManager类。 CommonsWare是对的;我只是在浏览源代码而不是相关的SDK,对不起。 – 2011-02-17 15:39:09
如何以编程方式在Android中打开/关闭通知?
你想要的东西无法使用Android SDK完成。
我知道这是可能的,因为所有的cuustome发射器都可以通过按钮按钮(LauncherPro,ADW等)来完成。
所有的“自定义启动程序”都绕过了SDK,使用@Yoni Samlan在其他问题的答案中提出的技术变体。不属于SDK的东西可以由设备制造商移除,由未来版本的核心Android团队取代等。
我会争辩说,你想要什么应该可以通过SDK;否则,它确实限制了其他主屏幕实现。然而,你和我想要什么都不算太多。
是的,你可以添加以下代码到你需要的地方执行
Object sbservice = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method showsb = statusbarManager.getMethod("expand");
showsb.invoke(sbservice);
并添加此权限
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
你可以编程方式关闭通知抽屉通过广播ACTION_CLOSE_SYSTEM_DIALOGS
意图。
这会导致“临时系统对话框”被解除。从文档:
临时系统对话框的一些示例是通知窗口阴影和最近的任务对话框。
这不需要任何权限,并且自从Android 1.0以来显然已经可用。
下面的代码对我的作品上运行Android 5.0的Nexus 4:
Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
不getSystemService( “状态栏”)返回一个对象? – 2011-02-17 14:04:09
是的,它的确如此。但是我不能将它映射到StatusBarManager,因为它不是公共API的一部分。所以,现在我只是把它当作“Object”类型。我可以做些什么来使其可用? – user496854 2011-02-17 15:25:42