Android 在没有可展开视图的情况下在状态栏中显示通知

Posted

技术标签:

【中文标题】Android 在没有可展开视图的情况下在状态栏中显示通知【英文标题】:Android Display a notification into the statusbar without an expandable view 【发布时间】:2013-03-31 09:27:44 【问题描述】:

我需要帮助才能做某事。 我尝试在 android 状态栏中显示通知。

它将通知用户与服务器的同步正在进行中。

现在,我使用这段代码,它工作正常:

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setSmallIcon(android.R.drawable.stat_notify_sync).setWhen(System.currentTimeMillis())
            .setAutoCancel(false).setOngoing(true);

    NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notif = builder.getNotification();
    nm.notify(1, notif);

唯一的问题是当用户展开状态栏时会创建一个视图。我想要做的只是在状态栏顶部显示一个小图标,没有内容视图。

有人知道怎么做吗? 提前致谢!

【问题讨论】:

我看到 CommonsWare 的几个回答说这是不可能的,但我也在几个应用程序(例如 Yahoo Mail)中看到了它 【参考方案1】:

这是不可能的。

基本原理是这样的:如果用户查看状态栏并看到一个图标,她应该有办法弄清楚该图标的含义。因此,通知面板中必须有一行与每个图标对应。

我建议创建一个通知,就像您在问题中所做的那样,说明正在进行同步;这是一个指示当前正在同步哪个应用程序的好机会(因此,如果出现某种问题或同步需要很长时间,用户就会知道哪个应用程序需要注意)。

【讨论】:

感谢您的回答。我看到雅虎邮箱在没有消耗视图的情况下发出通知,所以这很奇怪...... 真的吗?在通知阴影中创建没有一行的图标确实是不可能的。你能指点我的截图之类的吗? 我错了雅虎邮箱。雅虎应用程序显示的图标是同步图标,由操作系统显示。当应用程序执行服务器连接时,我使用不同的方式通知用户 ;-) 谢谢!【参考方案2】:

您可以使用此方法在状态栏上显示通知图标

 private void showNotification() 
    nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    // In this sample, we'll use the same text for the ticker and the
    // expanded notification

    // Set the icon, scrolling text and timestamp
    Notification notification = new Notification(R.drawable.ic_launcher,
            "Service Started", System.currentTimeMillis());
    // The PendingIntent to launch our activity if the user selects this
    // notification
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, MainActivity.class), 0);
    // Set the info for the views that show in the notification panel.
    notification.setLatestEventInfo(this, getText(R.string.service_label),
            "Service Started", contentIntent);
    // Send the notification.
    // We use a layout id because it is a unique number. We use it later to
    // cancel.
    nm.notify(R.string.service_started, notification);


【讨论】:

感谢您的回答,但这不是我想要的。您的代码与我的代码执行相同的操作(并且不推荐使用这种实例化通知的方式)。我不想要通知面板中的视图,而只想要状态栏中的小图标如果我不为通知面板放置视图,则会发生此异常:java.lang.IllegalArgumentException: contentView required: pkg=com.test.app.notification id=1 notification=Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x0 kind=[null])【参考方案3】:

好吧,这对于 InputMethodService 是可能的,只需使用 showStatusIcon(resource_name)。 但我认为这对于除了输入服务之外的任何东西都不是一个好主意。

【讨论】:

【参考方案4】:
Context context = TutListDownloaderService.this
.getApplicationContext();
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(NOTIFICATION_SERVICE);

创建通知:

Notification updateComplete = new Notification();
updateComplete.icon = android.R.drawable.stat_notify_sync;
updateComplete.tickerText = context.getText(R.string.notification_title);
updateComplete.when = System.currentTimeMillis();

创建待处理对象:

Intent notificationIntent = new Intent(context,TutListActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);

String contentTitle = context.getText(R.string.notification_title).toString();
String contentText;
if (!result) 
Log.w(DEBUG_TAG, "XML download and parse had errors");
contentText = context.getText(R.string.notification_info_fail).toString();
 else 
contentText = context.getText(
    R.string.notification_info_success).toString();

updateComplete.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

最后向用户显示通知:

notificationManager.notify(LIST_UPDATE_NOTIFICATION, updateComplete);

【讨论】:

以上是关于Android 在没有可展开视图的情况下在状态栏中显示通知的主要内容,如果未能解决你的问题,请参考以下文章

Android仅在状态栏展开时显示通知

如何在没有控件的情况下在 android 中制作相机应用程序,以便仅在屏幕上显示来自镜头的视图? [关闭]

Android在状态栏中添加视图

带有子元素的 Android 自定义可展开/可折叠视图

在保持 N 级或多级可展开列表视图的折叠/展开状态后,某些子组不会显示

我可以在不使用 Unity 的情况下在 Android VR 视图中添加像 youtube 这样的凝视控制功能吗?