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 中制作相机应用程序,以便仅在屏幕上显示来自镜头的视图? [关闭]