如何在Android中以编程方式打开/关闭通知?

时间:2011-02-17 13:09:51

标签: android android-notification-bar

我到处搜索,但在SDK或Google上找不到任何关于如何执行此操作的内容。我知道这是可能的,因为所有自定义发射器都可以通过按钮按下(LauncherPro,ADW等)来完成。

感谢。

7 个答案:

答案 0 :(得分:33)

您可以通过广播ACTION_CLOSE_SYSTEM_DIALOGS意图以编程方式关闭通知抽屉。

这会导致"临时系统对话框"被解雇来自文档:

  

临时系统对话框的一些示例是通知窗口阴影和最近的任务对话框。

这并不需要任何权限,并且自Android 1.0以来显然已经可用。

以下代码适用于运行Android 5.0的Nexus 4:

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);

答案 1 :(得分:19)

answer from Ashwin适用于4.2.2以下的Android版本(即低于版本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的一部分,因此不保证将来可以使用,很多人会建议不要这样做。

答案 2 :(得分:14)

是的,您可以将此代码添加到您希望执行的任何位置

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" />

答案 3 :(得分:4)

  

如何以编程方式在Android中打开/关闭通知?

使用Android SDK无法完成您想要的任务。

  

我知道这是可能的,因为所有苛刻的发射器都可以通过按钮按下(LauncherPro,ADW等)来完成。

所有“自定义发射器”都绕过SDK,使用@Yoni Samlan在您的问题的另一个答案中提出的技术变体。设备制造商可以删除不属于SDK的内容,在未来版本中由核心Android团队取代等。

我认为你想要的应该可以通过SDK;否则,它确实限制了替代的主屏幕实现。但是,你和我想要的并不是那么重要。

答案 4 :(得分:0)

遗憾的是,仍然没有正式的API(要求here),但是到目前为止,您可以使用此代码,该代码是我根据找到的所有答案得出的:

// based on https://gist.github.com/XinyueZ/7bad2c02be425b350b7f 
// requires permission: "android.permission.EXPAND_STATUS_BAR"
@SuppressLint("WrongConstant", "PrivateApi")
fun setExpandNotificationDrawer(context: Context, expand: Boolean) {
    try {
        val statusBarService = context.getSystemService("statusbar")
        val methodName =
                if (expand)
                    if (Build.VERSION.SDK_INT >= 17) "expandNotificationsPanel" else "expand"
                else
                    if (Build.VERSION.SDK_INT >= 17) "collapsePanels" else "collapse"
        val statusBarManager: Class<*> = Class.forName("android.app.StatusBarManager")
        val method: Method = statusBarManager.getMethod(methodName)
        method.invoke(statusBarService)
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

答案 5 :(得分:0)

答案 6 :(得分:-2)

以下是Android Launcher的showNotifications方法:

private void showNotifications() {
    final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
    if (statusBar != null) {
        statusBar.expand();
    }
}

(正如Robby指出的那样,是“状态栏”系统服务)。