Как я могу программно открывать/закрывать уведомления в Android?
Я искал везде, но не могу найти что-либо в SDK или в Google о том, как это сделать. Я знаю, что это возможно, потому что все пользовательские пусковые установки могут сделать это с помощью нажатия кнопки (LauncherPro, ADW и т.д.).
Спасибо.
Ответы
Ответ 1
Ответ от Ashwin работает для версий Android ниже 4.2.2 (т.е. ниже версии 17). В 4.2.2 метод "expand" был изменен на "expandNotificationsPanel". Если вы не используете это имя метода для 4.2.2 и выше, вы получите исключение Null Pointer. Таким образом, код должен быть:
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
Вы можете программно закрыть ящик уведомлений, передав ACTION_CLOSE_SYSTEM_DIALOGS
.
Это приводит к увольнению "временных системных диалогов". Из документации:
Некоторые примеры временных системных диалогов - это окно окна уведомлений и диалог недавних задач.
Это не требует каких-либо разрешений и, по-видимому, доступно с Android 1.0.
Следующий код работает для меня на Nexus 4 под управлением Android 5.0:
Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
Ответ 3
Да, вы можете добавить этот код туда, где вы хотите его выполнить
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" />
Ответ 4
Как я могу программно открывать/закрывать уведомления в Android?
То, что вы хотите, не может быть выполнено с помощью Android SDK.
Я знаю, что это возможно, потому что все пусковые установки cuustome могут сделать это с помощью нажатия кнопки (LauncherPro, ADW и т.д.).
Все "пользовательские пусковые установки" обходят SDK, используя вариант метода, который @Yoni Samlan предложил в другом ответе на ваш вопрос. Вещи, которые не являются частью SDK, могут быть удалены производителями устройств, заменены основной командой Android в будущих выпусках и т.д.
Я бы сказал, что то, что вы хотите, должно быть возможным через SDK; в противном случае, это действительно ограничивает альтернативные домашние экраны. Тем не менее, то, что вы и я хочу, не учитывает все это.
Ответ 5
Здесь метод showNotifications от Android Launcher
:
private void showNotifications() {
final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
if (statusBar != null) {
statusBar.expand();
}
}
(который, как указал Робби, является системной службой "statusbar" ).