只显示状态栏中的小图标,不显示通知

我想在status bar不断显示小图标,而不在系统的notification托盘上显示通知本身。

我尝试使用自定义layout ,并将根元素的可见性设置为View.GONEView.INVISIBLE ,但是对于这两者,系统将忽略它。

我也尝试设置根元素的高度,但系统也忽略了这一点。

这是我的代码:

R.layout.custom_notification

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/custom_notification" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/notif_background" android:orientation="horizontal" android:baselineAligned="false"/> 

和显示Notification的代码:

  NotificationManager nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx); mBuilder .setSmallIcon(drawableId) .setAutoCancel(false) .setOngoing(true) .setPriority(Notification.PRIORITY_MAX); Intent resultIntent = new Intent(ctx, SettingsActivity.class); PendingIntent resultPendingIntent = PendingIntent.getActivity(ctx, 0, resultIntent, 0); mBuilder.setContentIntent(resultPendingIntent); int layout = R.layout.custom_notification ; RemoteViews contentView = new RemoteViews(ctx.getPackageName(), layout); contentView.setViewVisibility(R.id.custom_notification, View.INVISIBLE); mBuilder.setContent(contentView); nm.notify(NOTIFICATION_ID, mBuilder.build()); 

我很清楚,为了实现我的目标,我将不需要logging的解决scheme。 而且我也知道用户体验指南强烈build议不要这样做。 所以写这个作为答案是毫无意义的。

Solutions Collecting From Web of "只显示状态栏中的小图标,不显示通知"

显示图标时不显示任何相关通知是不好的主意,根据开发人员文档,

状态栏通知需要以下所有内容:

  • 状态栏的图标(你感兴趣的)
  • 展开视图的标题和展开消息(除非您定义自定义展开视图)
  • PendingIntent,当点击通知显示相关信息时被触发。

所以,如果你不想破坏用户体验,那么强烈build议遵循用户体验指南,

逻辑上:状态栏有两部分 – 用户(通知)和系统(其他)。 如果系统允许将某些内容放入系统部分 – 将会有太多无用的图标(由其他应用程序发布),并且不会有一致性,并且可能会破坏所有的使用体验。

find一个答案,为您提供访问警报的默认状态栏图标的方式。 在你的手机之后,你可以做到这一点。在YouTube上有一些技巧,同一主题的一些答案build议使用通知显示图标,但把通知文本为空,使用户将只能看到图标, 但它不是一个办法

这是系统中状态栏执行的代码 ,其中描述了左右图标(即系统图标),可以从那里获得一些线索。 描述它的答案就在这里 。

我build议不要使用Google Play应用程序。 有几个原因:

  1. 如果你发现一个可以帮助显示隐形通知的错误,那么它看起来一无所获。 该错误只能在具有特定Android版本的部分设备上使用。 请记住:在大多数使用开放API的设备中,要正确执行常规代码是非常困难的。 隐藏的API不适用于所有设备。

    1. 源代码中没有这样的行为: http : //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/NotificationManager.java# NotificationManager.notify%28int%2Candroid.app.Notification%29 。 你不能find这样的行为。

    2. 为了预测行为,使用Android的Compat类。 也就是说,通知只使用NotificationCompat类! 只有与包装可以帮助您的应用程序显示通知。

    3. 这是非常非常丑陋的UI / UX。

    4. 通知的工作stream程在很大程度上取决于Android版本。

你可以使用InputMethodService.showStatusIcon()来做到这一点。 但我build议你显示正常的通知,并向用户解释你的应用程序现在做什么。

您可以使用RemoteViews来隐藏标题和文本

R.id.notification_layout.xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_marginRight="10dp" android:layout_marginLeft="7dp" android:src="@drawable/icon_battery" /> </RelativeLayout> 

在MainActivity中:

 RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_layout); Context application = getApplicationContext(); Intent resultIntent = new Intent(application, MainActivity.class); resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent resultPendingIntent = PendingIntent.getActivity(application, 0, resultIntent, 0); NotificationManager nmgr = (NotificationManager) application.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(application) .setSmallIcon(R.drawable.icon_battery); mBuilder.setContent(contentView); Notification mNotification = mBuilder.build(); // mNotification.flags |= FLAG_NO_CLEAR; nmgr.notify(0, mNotification);