什么是Notification


Notification用于在状态栏显示信息。这些信息一般来源于app的消息推送,或应用的一些功能控制(如播放器)

Notification的两种视图


普通视图

借用官方的图片说明一下Notification视图中包括的内容

1. 内容标题

2. 大图标(Bitmap)

3. 正文内容

4. 附加信息

5. 小图标

6. Notification的推送时间

大视图

除了上图中标出的第7点外,其他的基本和普通视图中的一样。

其中第7点可显示为一下几种内容

1. 显示大图片

在详情区域可以显示一张最大为256dp的图片

2. 显示长文本

在详情区域显示长文本

3. inbox style(因为不知道中文怎样才能说得准确,这里用英文表达)

inbox style在详情区域显示多行文本.

4. 大内容标题

允许用户为扩展视图定义另一个标题。

5. 摘要文本

允许用户在详情区域添加一行额外的文本

创建标准的Notification


以下三项式创建一个标准的Notification的先决条件

1. 小图标, 通过setSmallIcon()方法设置

2. 标题, 通过setContentTitle()方法设置

3. 内容文本, 通过setContentText()方法设置

我们这里不通过调用Notification构造方法的方式创建Notification,因为这种方法已经不推荐使用。

我们使用通过NotificationCompat.Builder类创建Notification。

程序的主布局文本中只有一个id为btnShow的按钮,点击这个按钮显示Notification

package com.whathecode.notificationdemo;

import android.app.Notification;
import android.app.NotificationManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button; public class MainActivity extends ActionBarActivity { private Notification mNotification;
private NotificationManager mNotificationManager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btnShow = (Button) findViewById(R.id.btnShow); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotification = new NotificationCompat.Builder(this)
// 设置小图标
.setSmallIcon(R.drawable.ic_launcher)
// 设置标题
.setContentTitle("you have a meeting")
// 设置内容
.setContentText("you have a meeting at 3:00 this afternoon")
.build(); btnShow.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
mNotificationManager.notify(0, mNotification);
}
});
}
}

运行效果

当然,这个Demo在4.x系统上是可以正常运行的。

当同样的代码在2.x的系统上面运行,程序会崩溃的。如下

而且,会抛出一个异常:

java.lang.IllegalArgumentException: contentIntent required: pkg=com.whathecode.notificationdemo id=0 notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x0)

上面的错误已经说得很清楚了,contentIntent required , 也就是需要contentIntent

这个contentIntent可以通过setContentIntent设置。

也就是说,上面所提到的三个先决条件只是确保4.x版本可以正常运行,

如果你的程序需要兼容2.x版本的,你就需要一个contentIntent

contentIntent的作用是点击Notification时跳转到其他的Activity

更新后的代码:

package com.whathecode.notificationdemo;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button; public class MainActivity extends ActionBarActivity { private Notification mNotification;
private NotificationManager mNotificationManager;
private PendingIntent mResultIntent; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btnShow = (Button) findViewById(R.id.btnShow); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); /*
* 取得PendingIntent,
* 因为我们现在不需要跳转到其他Activity,
* 所以这里只实例化一个空的Intent
*/
Intent intent = new Intent();
mResultIntent = PendingIntent.getActivity(this, 1, intent,
Intent.FLAG_ACTIVITY_NEW_TASK); mNotification = new NotificationCompat.Builder(this)
// 设置小图标
.setSmallIcon(R.drawable.ic_launcher)
// 设置标题
.setContentTitle("系统更新")
// 设置内容
.setContentText("发现系统更新,点击查看详情")
//设置ContentIntent
.setContentIntent(mResultIntent)
.build(); btnShow.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
mNotificationManager.notify(0, mNotification);
}
});
}
}

运行效果

完整的Notification实例


上面代码中的例子并不完整,只是演示了一个可以正常运行的实例

说它不完整是因为Notification到来的时候状态栏只有图标,没有文字,也没有声音提示,用户体验并不好。

当我们不设置LargeIcon的时候,系统就会使用当前设置的小图标作为大图标使用,小图标位置(位置5)则置空。

下面的代码是比较完整的Notification示例

package com.whathecode.notificationdemo;

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button; public class MainActivity extends ActionBarActivity { private Notification mNotification;
private NotificationManager mNotificationManager;
private PendingIntent mResultIntent; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btnShow = (Button) findViewById(R.id.btnShow); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); /*
* 取得PendingIntent, 并设置跳转到的Activity,
*/
Intent intent = new Intent(this, UpdateActivity.class);
mResultIntent = PendingIntent.getActivity(this, 1, intent,
Intent.FLAG_ACTIVITY_NEW_TASK); btnShow.setOnClickListener(new View.OnClickListener() { @SuppressLint("NewApi")
@Override
public void onClick(View v) { Bitmap largeIcon = BitmapFactory.decodeResource(
MainActivity.this.getResources(), R.drawable.luffy); mNotification = new NotificationCompat.Builder(getBaseContext()) // 设置大图标
.setLargeIcon(largeIcon) // 设置小图标
.setSmallIcon(R.drawable.ic_launcher) // 设置小图标旁的文本信息
.setContentInfo("1") // 设置状态栏文本标题
.setTicker("你的系统有更新") // 设置标题
.setContentTitle("系统更新") // 设置内容
.setContentText("发现系统更新,点击查看详情") // 设置ContentIntent
.setContentIntent(mResultIntent) // 设置Notification提示铃声为系统默认铃声
.setSound(
RingtoneManager.getActualDefaultRingtoneUri(
getBaseContext(),
RingtoneManager.TYPE_NOTIFICATION)) // 点击Notification的时候使它自动消失
.setAutoCancel(true).build(); mNotificationManager.notify(0, mNotification);
}
}); }
}

运行效果(Android 2.x)                                                             运行效果(Android 4.x)

                

通过观察上面两张图你会发现,在2.x版本下LargeIcon和contentInfo并没有生效。

这是因为setLargeIcon和setContentInfo都是在api level 11(honeycomb)才添加的功能

使用自定义布局统一Notification的显示效果


布局文件代码

<?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"
android:background="?android:attr/colorBackground"> <ImageView
android:id="@+id/largeIcon"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/luffy"
android:contentDescription="largeIcon" /> <TextView
android:id="@+id/contentTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/largeIcon"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:text="系统更新"/> <TextView
android:id="@+id/contentText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/contentTitle"
android:layout_below="@+id/contentTitle"
android:layout_marginTop="5dp"
android:text="发现系统更新,点击查看详情"
android:textSize="12sp"/> <TextView
android:id="@+id/when"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:text="11:00"/> <ImageView
android:id="@+id/smallIcon"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_alignRight="@+id/when"
android:layout_alignTop="@+id/contentText"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/contentInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/smallIcon"
android:layout_toLeftOf="@+id/smallIcon"
android:text="信息"
android:textSize="12sp" /> </RelativeLayout>

程序代码:

package com.whathecode.notificationdemo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.media.RingtoneManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.widget.Button;
import android.widget.RemoteViews; public class MainActivity extends Activity { private Notification mNotification;
private NotificationManager mNotificationManager;
private PendingIntent mResultIntent; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btnShow = (Button) findViewById(R.id.btnShow); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); /*
* 取得PendingIntent, 并设置跳转到的Activity,
*/
Intent intent = new Intent(this, UpdateActivity.class);
mResultIntent = PendingIntent.getActivity(this, 1, intent,
Intent.FLAG_ACTIVITY_NEW_TASK); btnShow.setOnClickListener(new View.OnClickListener() { @SuppressLint("NewApi")
@Override
public void onClick(View v) { RemoteViews customView = new RemoteViews(getPackageName(),
R.layout.customerviews); mNotification = new NotificationCompat.Builder(getBaseContext()) // 设置小图标
.setSmallIcon(R.drawable.ic_launcher) // 设置状态栏文本标题
.setTicker("你的系统有更新") //设置自定义布局
.setContent(customView) // 设置ContentIntent
.setContentIntent(mResultIntent) // 设置Notification提示铃声为系统默认铃声
.setSound(
RingtoneManager.getActualDefaultRingtoneUri(
getBaseContext(),
RingtoneManager.TYPE_NOTIFICATION)) // 点击Notification的时候自动移除
.setAutoCancel(true).build(); /*
* 当API level 低于14的时候使用setContent()方法是没有用的
* 需要对contentView字段直接赋值才能生效
*/
if (Build.VERSION.SDK_INT < 14) {
mNotification.contentView = customView;
} mNotificationManager.notify(0, mNotification);
}
}); }
}

上面的布局文件中的内容是硬编码的,也可以通过RemoteViews类中的setXXX方法动态设定内容。

这样程序便更加灵活

运行效果(android 2.x)                                                                             运行效果(android 4.x)

                 

在两个版本中的运行效果基本一样了,但是,在低版本下不是很完美,有部分灰白的地方特别扎眼

网上查了很久也没有找到解决办法,有知道的请告知

更新Notification的内容


因为我们创建的Notification是通过一个Id分别的,因此只要在使用NotificationManager的notify()方法的时候使用

相同的Id就可以更新这个Notification的内容

当然在使用notify()方法之前我们还是要创建一个Notification实例。

状态栏消息提示——使用Notification的更多相关文章

  1. 第13讲- Android之消息提示Notification

    第13讲 Android之消息提示Notification .Notification Notification可以理解为通知的意思一般用来显示广播信息,通知可以显示到系统的上方的状态栏(status ...

  2. Android实现系统下拉栏的消息提示——Notification

    Android实现系统下拉栏的消息提示--Notification 系统默认样式 默认通知(通用) 效果图 按钮 <Button android:layout_width="match ...

  3. 在vue项目中的main.js中直接使用element-ui中的Message 消息提示、MessageBox 弹框、Notification 通知

    需求来源:向后台请求数据时后台挂掉了,后台响应就出现错误,不做处理界面就卡住了,这时需要在main.js中使用axios的响应拦截器在出现相应错误是给出提示.项目使用element-ui,就调用里面的 ...

  4. Android三种消息提示

    Android消息提示有三种方式: 1  使用Toast显示消息提示框 Toast类用于在屏幕中显示一个提示信息框,该消息提示框没有任何控制按钮,并且不会获得焦点,经过一定时间后自动消失.通常用于显示 ...

  5. Android消息通知(notification)和PendingIntent传值

    通知栏的自定义布局:转:http://blog.csdn.net/vipzjyno1/article/details/25248021 拓展 实现自定义的通知栏效果: 这里要用到RemoteViews ...

  6. AutoCompleteTextView,Spinner,消息提示

    package com.example.wang.testapp2; import android.app.Notification; import android.app.NotificationM ...

  7. android中提示&对话框----Notification

    Notification(状态栏通知) 一.Notification用于状态栏显示通知的控件,在不同的设备上面Notification是不一样的 二.Notification的基本布局 元素组成: I ...

  8. Android——AutoCompleteTextView、Spinner和消息提示

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  9. React Native之通知栏消息提示(ios)

    React Native之通知栏消息提示(ios) 一,需求分析与概述 详情请查看:React Native之通知栏消息提示(android) 二,极光推送注册与集成 2.1,注册 详情请查看:Rea ...

随机推荐

  1. JavaScript基本语法(三)

    上篇博文说到JS的运算符,这次说说JS程序流程控制. 1. 条件语句 if 语法: if(condition) statements1 else statement2 当括号里的条件成立的时候,执行i ...

  2. iOS多线程简介

    1.进程 什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开迅雷.Xcode,系统就会分别启动2个进程 2.线程 什么是 ...

  3. eclipse配置tomcat 和JRE环境

    配置JRE环境,通俗点讲就是添加一个不同版本的jdk window——preferences——java——installed jres 点击add添加   选择standard VM 选择一个本机正 ...

  4. 了解HTML 盒模型

    HTML在布局上, 有一个非常重要的模型, 那就是盒子模型, 在盒子模型中把标签内容理解为一个物品, 而css样式理解为包容着这个物品的盒子, 一般的块级标签都具有盒子模型的特征, 你可以在css中对 ...

  5. iOS开发之功能模块--高仿Boss直聘的常用语的开发

    首先上Boss直聘的功能界面截图,至于交互请读者现在Boss直聘去交互体验:     本人的公司项目要高仿Boss直聘的IM常用语的交互功能,居然花费了我前后17个小时完成,这回自己测试了很多遍,代码 ...

  6. python文件读写操作与linux shell变量命令交互执行

    python对文件的读写还是挺方便的,与linux shell的交互变量需要转换一下才能用,这比较头疼! #coding=utf-8 #!/usr/bin/python import os impor ...

  7. TNS-12518 & Linux Error:32:Broken pipe

    最近一周,有一台ORACLE数据库服务器的监听服务在凌晨2点过几分的时间点突然崩溃,以前从没有出现过此类情况,但是最近一周出现了两次这种情况,检查时发现了如下一些信息: $ lsnrctl servi ...

  8. 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下

    阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...

  9. 大数据系列(2)——Hadoop集群坏境CentOS安装

    前言 前面我们主要分析了搭建Hadoop集群所需要准备的内容和一些提前规划好的项,本篇我们主要来分析如何安装CentOS操作系统,以及一些基础的设置,闲言少叙,我们进入本篇的正题. 技术准备 VMwa ...

  10. Docker 1.12 集群

        环境介绍 虚拟机两台,vmware ,网络为NAT node139:192.168.190.139 Node140: 192.168.190.140     设置hostname 以139为例 ...