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

use*_*854 29 android android-notification-bar

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

谢谢.

Chr*_*Orr 35

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

这导致"临时系统对话"被驳回.从文档:

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

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

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

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
Run Code Online (Sandbox Code Playgroud)

  • 此功能已被弃用,并且在 Android 12 中不起作用 (5认同)
  • 这对我有所帮助.谢谢. (2认同)

Jon*_*han 22

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 );
Run Code Online (Sandbox Code Playgroud)

并应添加适当的许可AndroidManifest.

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Run Code Online (Sandbox Code Playgroud)

显然,这不是已发布的API的一部分,因此不保证将来可以使用,许多人会建议不要这样做.

  • 这似乎不适用于使用Lollipop或更高版本的三星设备.我错了吗 ? (3认同)

Ash*_*ngh 15

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

Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
Method showsb = statusbarManager.getMethod( "expand" );
showsb.invoke( sbservice );
Run Code Online (Sandbox Code Playgroud)

并添加此权限

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Run Code Online (Sandbox Code Playgroud)