解读Notification

article/2025/9/11 20:49:08
综述
    status bar notification添加一个图标(和一条可选的ticker-text消息)到系统的status bar(状态条),并且显示一个notification message(通知消息)在系统的notifications window(消息窗口)中。当用户选择了消息窗口中的一条消息,Android系统就发出一个通过Notification定义的Intent(通常是用于启动一个activity)。你也可以通过配置notification以通过声音、震动或者是设备上的flashing lights(闪光灯)来告知用户。
    status bar notification用于后台运行的服务需要告知用于一些事件并且得到用户的响应的情况下。后台运行的服务为了及时得到用户的相应不应该自己启动一个activity。而应该创建一个用户选择后可以启动activity的status bar notification。
    图一显示了一个左边包含一个nitification的图片。
    图二显示了在notifications window中有的notifications。
基本
    一个Activity 或者是Service可以初始化一个status bar notification。由于一个通常只有在处于前台运行并且和用户交互的时候才能执行操作,因此,我们通常是通过一个service来创建notifications。这时,即使用户在运行其他的程序或者是设备进入休眠状态的时候,我们依然可以在后台创建notifications。要创建一个notification,我们必须要用到两个类:Notification和NotificationManage。
    用Notification类的实例来定义status bar notification的属性,例如:status bar notification的图标、显示的message(信息)以及额外的设置,例如播放的声音。NotificationManager是Android的一项系统服务,通过它可以执行和管理所有的status bar notifications。你不能直接实例化NotificationManager这个类。为了实现自己的Notification,你必须通过getSystemService()方法获得NotificationManager,然后,当你想通知用户的时候,将Notification传递给notify()这个方法,这样就实现了自己的status bar notification。
    通过如下步骤来创建一个status bar notification:
    1.获得NotificationManager:
         String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
    2.实例化Notification:
         int icon = R.drawable.notification_icon;
CharSequence tickerText = "Hello";
long when = System.currentTimeMillis();

Notification notification = new Notification(icon, tickerText, when);
    3.定义notification要显示的message和PendingIntent:
         Context context = getApplicationContext();
CharSequence contentTitle = "My notification";
CharSequence contentText = "Hello World!";
Intent notificationIntent = new Intent(this, MyClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
    到这里,我们就实现了一个notification,用户应该可以收到这个notification了。
    这里我们举一个实例,方便大家清楚的了解,要实现的效果就是在主Mactivity上显示一个Button,当按下这个Button时,就发出我们自定义的一个notification,具体步骤如下:
    第一步:新建一个工程,命名为:Notification01;
    第二步:修改布局文件main.xml,添加一个Button;

    第三步:修改java源文件,代码如下:

public class Notification01Activity extends Activity {private Button sendBtn;private static final int HELLO_ID = 1;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sendBtn = (Button)findViewById(R.id.sendBtn);String ns = Context.NOTIFICATION_SERVICE;final NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);int icon = R.drawable.notification_icon;CharSequence tickerText = "Notification01";long when = System.currentTimeMillis();final Notification notification = new Notification(icon, tickerText, when);final Context context = getApplicationContext();final CharSequence contentTitle = "My notification";final CharSequence contentText = "Notification01!";sendBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent notificationIntent = new Intent(Notification01Activity.this, Notification01Activity.class);PendingIntent contentIntent = PendingIntent.getActivity(Notification01Activity.this, 0, notificationIntent, 0);notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);mNotificationManager.notify(HELLO_ID, notification);}});}
}

大家看这些代码,和之前给的示例代码片段是十分类似的,这还是比较简单的。
    第四步:运行程序可以看到这个效果:

          首先再status bar上看到我们的notification,如下图:


          然后打开notifications window,可以看到我们的notification,如下图:


Managing your Notification
NotificationManager是一个用来管理所有notifications的系统服务。你必须通过getSystemService()方法来获得对它的一个引用。例如:
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
   当你想发出你的status bar notification的时候,就将Notificatiion传递给NotificationManager的notify(int, Notification)。第一个参数是这个notification的唯一的ID,第二个参数是一个Notification的对象。第一个参数(ID)在你的应用中必须是惟一的。对于你更新自己的notification或者是要对不同的notification采取不同的动作,这个时候这个ID号就是必须的,他就是用来识别特定的那个要更新的或者是要采取特定动作的那个notification。
   当用户在notification window中选中了一个notification后,我们就希望这个notification得到用户相应了,就应该被清除了,这个怎么达到呢?我们可以通过在Notification的flag域中设置“FLAG_AUTO_CANCEL”标志即可。例如:
   Notification n;
   n.flag |= FLAG_AUTO_CANCEL;
   这样就可以达到效果了,如果你不进行清除,那么这个status bar notification就会一直显示在status bar上面。当然,你也可以通过cancel(int)方法来清除特定的notification,这个方法参数就是之前的特定的那个ID,或者是使用cancelAll()方法清除你应用程序中的所有的nitifications.
创建自定义的Notification布局
   默认的情况下,出现在notifications window中的notification包含一个标题和一条信息,就像上面示例的截图那样。显示的标题和信息的内容都是通过setLatesEventInfo()方法中的contentTitle和contentText参数来指定的。然而,你也可以利用RemoteViews来实现自定义的notification的布局。
   要为notification定义自己的布局,就需要实例化一个TemoteViews对象来解析自定义的布局文件,然后将RemoteViews传递到你自己的Notification的contentView参数域。
   下面用实例来说明:
   1.为notification创建自定义的XML文件,例如下面的custom_notification.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" >
    <ImageView android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="10dp" />
    <TextView android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image"
        style="@style/NotificationTitle" />
    <TextView android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image"
        android:layout_below="@id/title"
        style="@style/NotificationText" />
</RelativeLayout>
   注意:以上的两个TextView元素都是包含再style属性中的。在你自己的notifications中为text使用style资源是非常重要的,因为notification的背景色会因为不同的设备和不同的系统版本而变化。从Android2.3(API Level9)开始,系统给默认的notification布局的text定义了style,因此,当你使用2.3或更高版本时,你应该使用这个style来确保你的text再系统背景下是可见的。
   例如:当使用低于2.3版本系统时,要使用标准的text colors,就必须使用如下的styles,此示例为:/res/values/styles.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NotificationText">
      <item name="android:textColor">?android:attr/textColorPrimary</item>
    </style>
    <style name="NotificationTitle">
      <item name="android:textColor">?android:attr/textColorPrimary</item>
      <item name="android:textStyle">bold</item>
    </style>
    <!-- If you want a slightly different color for some text,
         consider using ?android:attr/textColorSecondary -->
</resources>
当要使用2.3或更高本版的默认的notification colors时,我们必须使用如下的styles,此示例为:res/values-v9/styles.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />
    <style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />
</resources>
当你运行再2.3或者更高版本系统上时,你的notification中的text将会使用一样的系统的默认定义的。这是十分重要的,因为Android的后续版本将notification的背景颜色改变为dark。继承系统默认的定义将确保你的text在这种情况下会显示正常,并且如果背景颜色被盖为其他的颜色,你的text也可以适应这种变化而正常显示。
    2.在代码中,用RemoveViews方法来定义notification显示的图像和消息。然后将RemoteViews对象传递给Notification的contentView参数,如下所示:
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
contentView.setImageViewResource(R.id.image, R.drawable.notification_image);
contentView.setTextViewText(R.id.title, "Custom notification");
contentView.setTextViewText(R.id.text, "This is a custom layout");
notification.contentView = contentView;
正如这里所看到的一样,把应用程序的包名以及布局文件的ID传递给RemoteViews构造器。然后用setImageResource()方法和setTextViewText()方法为InageView和TextView组件定义显示内容。最后将RemoteViews对象传递给Notification的contentView即可。
    3.由于在使用自定义的view时不必使用setLastEventInfo()方法,所以你必须为Notification的contentIntent域定义一个Intent,如下所示:
Intent notificationIntent = new Intent(this, MyClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;
    4.可以通过如下方法发送notification:
mNotificationManager.notify(CUSTOM_VIEW_ID, notification);
RemoteViews类同样包含一些方法使得你可以很容易的为notification的布局中添加Chronome和ProgressBar组件。详细的关于为notification创建自定义的布局,可以查看RemoteViews类。
    注意:当为notification创建自定义的布局时,你必须确保它能够再不同的设备方向以及分辨率下都正常工作。这对于所有的布局工作都是十分重要的,所以,不要定义过于复杂的布局,而且要在多种情况下进行测试。


http://chatgpt.dhexx.cn/article/yC7qxtZj.shtml

相关文章

Android-自定义Notification

Android-自定义Notification 2014年4月26日 消息栏的消息&#xff0c;想必各位Android发烧友很清楚知道是什么&#xff0c;比如我们下载了一个应用&#xff0c;它可能会定时推送些消息到我们的手机中&#xff0c;比如微信消息送达的时候&#xff0c;可能会在通知栏显示。本博文…

notification新旧用法 notification builder

api 11 版本之前&#xff1a; //显示通知信息protected void showNotification() {NotificationManager notificationManager (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Notification notification new Notification(this,R.drawable.ic_launche…

Android Notification 详解

下图是我对 Notification 做的思维导图&#xff0c;也是本文的主要逻辑。&#xfffc; 本文主要讲述 Notification 的基本操作部分&#xff0c;进阶部分的内容还在学习ing~ Notification 概述 Notification&#xff0c;是一种具有全局效果的通知&#xff0c;可以在系统的通知栏…

Android Notification

日记月累第四天。发现做事情坚持真的很重要&#xff0c;其实我今天都有点凌乱了&#xff0c;不想记录了&#xff0c;在坚持一下吧&#xff0c;毕竟才第四天。今天对昨天同事所说的Notification进行了一下温故今天主要是拿来主意&#xff0c;明天代码实践。今天公司又有同事分享…

HTML5 桌面通知:Notification API

Notification API 是 HTML5 新增的桌面通知 API&#xff0c;用于向用户显示通知信息。该通知是脱离浏览器的&#xff0c;即使用户没有停留在当前标签页&#xff0c;甚至最小化了浏览器&#xff0c;该通知信息也一样会置顶显示出来。 用户权限 想要向用户显示通知消息&#xf…

Android自定义Notification

Notification是一种让你的应用程序在不使用Activity的情况下警示用户&#xff0c;Notification是看不见的程序组件警示用户有需要注意的事件发生的最好途径。 作为UI部分&#xff0c;Notification对移动设备来说是最适合不过的了。用户可能随时都带着手机在身边。一般来说&…

Notification-通知

Notification-通知 通知是一种消息&#xff0c;这种消息呈现在应用UI之外&#xff0c;通过通知可以对用户进行提醒、可以和其他用户收发信息等。通过点击通知&#xff0c;可以唤起app页面或者直接在通知上执行一些操作。下面介绍通知的一些常用用法。 展示一条普通通知 先来…

全面解析Notification

Notification在Android中使用的频率可以说是非常高的,本篇博客,我将围绕着Notification的各方面进行解析,使大家对Notification有更好的认识。 Notification的使用步骤 1.获取NotificationManager NotificationManager mNotificationManager = (NotificationManager) get…

Android Notification使用

Android 通知栏适配 前言正文一、Android中通知的变化1. Android 4.1&#xff0c;API 162. Android 4.4&#xff0c;API 19 和 203. Android 5.0&#xff0c;API 214. Android 7.0&#xff0c;API 245. Android 8.0&#xff0c;API 266. Android 12.0&#xff0c;API 31 二、创…

Android之Notification的多种用法

我们在用手机的时候&#xff0c;如果来了短信&#xff0c;而我们没有点击查看的话&#xff0c;是不是在手机的最上边的状态栏里有一个短信的小图标提示啊&#xff1f;你是不是也想实现这种功能呢&#xff1f;今天的Notification就是解决这个问题的。 我们也知道Android系统也是…

Android--通知之Notification

前言 之前一篇博客讲了Android下使用Toast的方式提示消息。这篇博客讲解一下在Android中使用Notification提示消息给用户&#xff0c;Notification是一种具有全局效果的通知&#xff0c;程序一般通过NotificationManager服务来发送Notification。在本篇博客中&#xff0c;将介绍…

Android通知Notification使用全解析,看这篇就够了

1、效果 2、简介 通知是 Android 在您的应用 UI 之外显示的消息&#xff0c;用于向用户提供提醒、来自其他人的通信或来自您的应用的其他及时信息。用户可以点击通知打开您的应用或直接从通知中执行操作。 2.1、展示 通知以不同的位置和格式向用户显示&#xff0c;例如状态栏…

php cacti,cacti搭建遇到的那些事

最近闲的无聊&#xff0c;亲手操刀了一把整个生产环境cacti的搭建&#xff0c;时间消耗了3-4天&#xff0c;这里主要感谢网友老李、不想扮演逃兵、jiam的指导和帮助。下面就说说我搭建这个遇到的一些棘手的问题吧&#xff01; 搭建完成的界面如下图&#xff1a; 系统环境&#…

cacti mysql_cacti监控mysql

1.MySQL stats模板 功能&#xff1a;用来监控MySQL状态&#xff0c;其中包括索引使用情况、查询、排序、锁定情况等。 1).将mysql_stats.php 和 dumpMemcachedStats.php脚本放到cacti脚本目录下(/usr/local/apache/htdocs/cacti/.s/)&#xff0c;导入模板时注意选择cacti_host_…

cacti mysql 详解,cacti详解和基本配置

cacti简介&#xff1a; cacti是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获取数据&#xff0c;然后用rrdtool存储和更新数据&#xff0c;当用户需要查看数据的时候就用rrdtool生成图表呈现给用户。snmp抓到的数据不是存储在mysql中&#xff0c;而是存在rrd…

cacti安装

1、搭建LNMP环境 http://blog.csdn.net/yang_xu_1987/article/details/77292340 #下面是按照源码搭建LNMP的方式&#xff0c;主要是路径不一样 2、安装rrd-tool、snmp相关包 yum install -y rrdtool net-snmp net-snmp-utils 3、安装cacti 下载cacti&#xff1a;http://down…

java cacti_开源的企业级监控系统 Cacti 简介

Cacti是一款网络流量监测图形分析工具&#xff0c;把LAMP的功能都结合起来&#xff0c;用于网络流量监控&#xff0c;操作起来非常方便&#xff01;让我们认识下Cacti简介及工作流程。 一、Cacti简介 1. cacti是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获…

安装cacti

1、搭建LAMP环境 yum -y install httpd mariadb mariadb-server mariadb-devel php php-mysql php-gd php-pear gd gd-devel systemctl start httpd && systemctl enable httpd systemctl start mariadb && systemctl enable mariadb 2、安装绘图工具和SNMP组…

Cacti安装及模板导入

文章目录 前言简介安装安装http以及php及php相关扩展安装数据库mariadb&#xff0c;配置yum源&#xff1a;安装snmp及其相关扩展&#xff08;注意版本号得一致&#xff09;安装绘图工具RRDTool绘图工具安装spine安装中文字体安装cacti初始化cacti 应用管理设备以及创建图形加入…

搭建cacti

1、搭建lamp环境 yum -y install httpd mariadb mariadb-server mariadb-devel php php-mysql php-gd php-pear gd gd-devel systemctl start httpd && systemctl enable httpd systemctl start mariadb && systemctl enable mariadb 2、安装绘图工具和snmp组件…