文档章节

android notification 的总结分析

摆渡者
 摆渡者
发布于 2015/06/13 11:35
字数 1181
阅读 327
收藏 2
点赞 0
评论 0

分类

 Android的notification有以下几种:

1>普通notification

图1

  1. 标题,通过NotificationCompat.Builder.setContentTitle(String title)来设置

  2. 大图标,通过NotificationCompat.Builder.setLargeIcon(Bitmap icon)来设置

  3. 内容,通过NotificationCompat.Builder.setContentText("ContentText")来设置

  4. 内容附加信息通过NotificationCompat.Builder.setContentInfo("ContentInfo")来设置

  5. 小图标,通过NotificationCompat.Builder.setSmallIcon(int icon)来设置

  6. 时间,通过NotificationCompat.Builder.setWhen(when)来设置

注:

一个notification不必对上面所有的选项都进行设置,但有3项是必须的:

  • 小图标, set by setSmallIcon()

  • 标题, set by setContentTitle()

  • 内容, set by setContentText()

2>大布局Notification

图2

大布局notification是在android4.1以后才增加的,大布局notification与小布局notification只在‘7'部分有区别,其它部分都一致。大布局notification只有在所有notification的最上面时才会显示大布局,其它情况下显示小布局。你也可以用手指将其扩展为大布局(前提是它是大布局)。如下图:

图3

大布局notification有三种类型:如图2为NotificationCompat.InboxStyle 类型。图3左部为NotificationCompat.BigTextStyle。图3右部 为:NotificationCompat.BigPictureStyle.

InboxStyle类型的notification看起来和BigTextStyle类型的notification,那么他们有什么不同呢?对于InboxStyle类型的notification,图2的‘7’位置处每行都是很简短的,第一行和最后两行由于内容很长,则使用了省略号略去了过长的内容;而图3的左图中,BigTextStyle类型的notification则是将过长的内容分在了多行显示

3>自定义布局notification

除了系统提供的notification,我们也可以自定义notification。如下图所示的一个音乐播放器控制notification:


图4

创建自定义的notification

    1>实例化一个NotificationCompat.Builder对象;如builder

    2>调用builder的相关方法对notification进行上面提到的各种设置

    3>调用builder.build()方法此方法返回一个notification对象。

    4>获取系统负责通知的NotificationManager;如:manager

    5>调用manager的notify方法。


示例代码

示例程序截图:

图5

0>初始化部分代码

public class MainActivity extends Activity implements OnClickListener {

    private int[] btns = new int[] { 
            R.id.normal, R.id.inboxStyle, 
            R.id.bigTextStyle, R.id.bigPicStyle, 
            R.id.customize, R.id.progress,
            R.id.cancelNotification };
    private NotificationManager manager;
    private Bitmap icon = null;

    private static final int NOTIFICATION_ID_NORMAL = 1;
    private static final int NOTIFICATION_ID_INBOX = 2;
    private static final int NOTIFICATION_ID_BIGTEXT = 3;
    private static final int NOTIFICATION_ID_BIGPIC = 4;
    private static final int NOTIFICATION_ID_CUSTOMIZE = 5;
    private static final int NOTIFICATION_ID_PROGRESS = 6;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取系统的通知服务
        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
        for (int btn : btns) {
            findViewById(btn).setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.normal:
            showNormalNotification();
            break;
        case R.id.inboxStyle:
            showInboxStyleNotification();
            break;
        case R.id.bigTextStyle:
            showBigTextStyleNotification();
            break;
        case R.id.bigPicStyle:
            showBigPicStyleNotification();
            break;
        case R.id.customize:
            showCustomizeNotification();
            break;
        case R.id.progress:
            showProgressBar();
            break;
        case R.id.cancelNotification:
            cancelNotification();
            break;
        default:
            break;
        }
    }
}

1>普通notification

private void showNormalNotification() {
    Notification notification = new NotificationCompat.Builder(this)
            .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher)
            .setTicker("NormalNotification").setContentInfo("ContentInfo")
            .setContentTitle("ContentTitle").setContentText("ContentText")
            .setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL)
            .build();
    manager.notify(NOTIFICATION_ID_NORMAL, notification);
}

2>大布局Text类型notification

private void showBigTextStyleNotification() {
    NotificationCompat.BigTextStyle textStyle = new NotificationCompat.BigTextStyle();
    textStyle.setBigContentTitle("BigContentTitle")
            .setSummaryText("SummaryText")
            .bigText("I am Big Texttttttttttttttttttttttttttttttttt"
                    + "tttttttttttttttttttttttttttttttttttttttttttt"
                    + "!!!!!!!!!!!!!!!!!!!......");
    Notification notification = new NotificationCompat.Builder(this)
            .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher)
            .setTicker("showBigTextStyleNotification").setContentInfo("contentInfo")
            .setContentTitle("ContentTitle").setContentText("ContentText")
            .setStyle(textStyle).setAutoCancel(false)
            .setShowWhen(false).setDefaults(Notification.DEFAULT_ALL)
            .build();
    manager.notify(NOTIFICATION_ID_BIGTEXT, notification);
}

3> 大布局Inbox类型notification

private void showInboxStyleNotification() {
    String[] lines = new String[]{"line1", "line2", "line3"};
    NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
    inboxStyle.setBigContentTitle("BigContentTitle")
        .setSummaryText("SummaryText");
    for (int i = 0; i < lines.length; i++) {
        inboxStyle.addLine(lines[i]);
    }
    Notification notification = new NotificationCompat.Builder(this)
            .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher)
            .setTicker("showBigView_Inbox").setContentInfo("ContentInfo")
            .setContentTitle("ContentTitle").setContentText("ContentText")
            .setStyle(inboxStyle).setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .build();
    manager.notify(NOTIFICATION_ID_INBOX, notification);
}

4>大布局Picture类型notification

private void showBigPicStyleNotification() {
    NotificationCompat.BigPictureStyle pictureStyle = new NotificationCompat.BigPictureStyle();
    pictureStyle.setBigContentTitle("BigContentTitle")
            .setSummaryText("SummaryText")
            .bigPicture(icon);
    Notification notification = new NotificationCompat.Builder(this)
            .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher)
            .setTicker("showBigPicStyleNotification").setContentInfo("ContentInfo")
            .setContentTitle("ContentTitle").setContentText("ContentText")
            .setStyle(pictureStyle)
            .setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL)
            .build();
    manager.notify(NOTIFICATION_ID_BIGPIC, notification);
}

5>自定义notification
效果图:

图6

并对中间的播放按钮做了一个简单的点击处理事件:

private void showCustomizeNotification() {
    RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_notification);
    Intent intent = new Intent(this, PlayMusicActivity.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    remoteViews.setOnClickPendingIntent(R.id.paly_pause_music, pendingIntent);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContent(remoteViews).setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(icon).setOngoing(true)
            .setTicker("music is playing").setDefaults(Notification.DEFAULT_ALL);
    manager.notify(NOTIFICATION_ID_CUSTOMIZE, builder.build());
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:gravity="center_vertical"
     android:orientation="horizontal" >

     <ImageView
         android:id="@+id/singer_pic"
         android:layout_width="64dp"
         android:layout_height="64dp"
         android:src="@drawable/singer" />

     <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:gravity="center_vertical"
         android:orientation="horizontal" >

         <ImageView
             android:id="@+id/last_music"
             android:layout_width="0dp"
             android:layout_height="48dp"
             android:layout_weight="1"
             android:src="@drawable/player_previous" />

         <ImageView
             android:id="@+id/paly_pause_music"
             android:layout_width="0dp"
             android:layout_height="48dp"
             android:layout_weight="1"
             android:src="@drawable/player_pause" />

         <ImageView
             android:id="@+id/next_music"
             android:layout_width="0dp"
             android:layout_height="48dp"
             android:layout_weight="1"
             android:src="@drawable/player_next" />
     </LinearLayout>
 </LinearLayout>

带进度条的notification:

private void showProgressBar() {
    final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher)
            .setTicker("showProgressBar").setContentInfo("ContentInfo")
            .setOngoing(true).setContentTitle("Downloading...")
            .setContentText("ContentText");
    new Thread(new Runnable() {
        @Override
        public void run() {
            int progress = 0;
            for (progress = 0; progress < 100; progress += 5) {
                //将setProgress的第三个参数设为true即可显示为无明确进度的进度条样式
                //builder.setProgress(100, progress, true);
                builder.setProgress(100, progress, false);
                manager.notify(NOTIFICATION_ID_PROGRESS, builder.build());
                try {
                    // Sleep for 5 seconds
                    Thread.sleep(2 * 1000);
                } catch (InterruptedException e) {
                }
            }
            builder.setContentTitle("Download complete")
                    .setProgress(0, 0, false).setOngoing(false);
            manager.notify(NOTIFICATION_ID_PROGRESS, builder.build());
        }
    }).start();
}


本文转载自:http://www.jb51.net/article/36567.htm

共有 人打赏支持
摆渡者
粉丝 318
博文 169
码字总数 205794
作品 0
浦东
程序员
Android Notification详解——响应notification事件

上一篇讲了如何创建并显示一个notification,这一篇就总结下点击notification后,程序应该如何响应。 一般来讲,点击一个notification后,都会打开一个Activity做为对点击事件的响应,这个A...

Carl_
2015/04/29
0
0
android Notification 的使用(转自他人)

最近一直在研究 android ,并一边研究一边做应用。其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题。经过研究实现了其功能,现把 Notificati...

eric_zhang
2012/02/10
0
0
第88章、系统服务之NOTIFICATION_SERVICE服务(从零开始学Android)

Notification通知将一个图标(包含一条可选的提示文本信息)填加到系统的状态栏(一般来说,Android手机的状态栏是在顶部,非底部,要注意噢)中,并将一条展开信息添加到通知窗口中。当用户...

simpower
2014/09/01
0
0
Android 状态栏通知Notification

Notification可以在屏幕最顶部的状态栏上显示一个图标通知,通知的同时可以播放声音,以及振动提示用户,点击通知还可以返回指定的Activity.   今天例子的效果图: 布局main.xml: <?xml ver...

james_laughing
2014/12/16
0
2
Android的Notification研究

Android的Notification研究 最近在研究Android,遇到了一些Notification(通知)的问题: 1、Notification如何传递参数 2、Notification如何区别化 3、从Intent(意图)寻找Activity(活动)说起,...

天下杰论
2013/03/12
0
0
Android 中的 Service 全面总结

1、 Service的种类 按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务...

crystaltiger
2013/09/25
0
1
Android内存优化(六)LeakCanary使用详解

相关文章 Android性能优化系列 Java虚拟机系列 1.概述 如果使用MAT来分析内存问题,会有一些难度,并且效率也不是很高,对于一个内存泄漏问题,可能要进行多次排查和对比。 为了能够简单迅速...

刘望舒
2017/09/10
0
0
android service被系统回收的解决方法

android service被系统回收的解决方法 博客分类: Android开发 androidservicekill 自己的app的service总是容易被系统回收,搜罗了一下,基本上的解决思路有以下几种: 1.把service写成系统服...

zhouw
2014/03/29
0
0
Android push (一):SMS push

Android push (一):SMS push 移动终端为了节省电量和网络流量,不再采用轮训服务器的方式来收集数据,而是在服务器有数据需要发送到终端时通知终端。我们称这种机制叫推送(push)。终端接...

LiSteven
2013/06/04
0
1
Notification使用详解之三:通过服务更新进度通知&在Activity中监听服务进度

上次我们讲到如何实现一个可更新的进度通知,实现的方式是启动一个线程模拟一个下载任务,然后根据任务进度向UI线程消息队列发送进度消息,UI线 程根据进度消息更新通知的UI界面。可是在实际...

MZHS
2013/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sklearn学习笔记之简单线性回归

简单线性回归 线性回归是数据挖掘中的基础算法之一,从某种意义上来说,在学习函数的时候已经开始接触线性回归了,只不过那时候并没有涉及到误差项。线性回归的思想其实就是解一组方程,得到...

wangxuwei
9分钟前
0
0
feign之动态interceptor(二)

背景 上文提到了按照不同的feignClient可以根据多个不同的key来进行多个不同的bean的配置 那么我们如何完成多个interceptor的配置呢? 分析 我们刚提到多个配置的玄机就在FeignClientProper...

Mr_Qi
11分钟前
1
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

问题终结者
35分钟前
0
0
Apache配置时.htaccess失效不起作用的原因分析

.htaccess 失效的原因 1. 重写规则有问题,检查自己的重写规则 2.Apache配置问题,配置中没有配置启用 rewrite a2enmod rewrite 3.网站配置文件没有启用配置需要配置 000-default.conf <Dire...

TU-DESGIN
56分钟前
1
0
两个求最大公约数C/C++算法实现

#include<stdio.h> #include<time.h> #include <iostream>using namespace std;//求最大公约数 LCD(Largest Common Division)//短除法 //m=8251, n=6105; int LCD_ShortDiv(int m, ......

失落的艺术
今天
1
0
QueryPerformanceCounter

windows的Sleep函数,睡眠线程指定毫秒数,可以用来做毫秒延时。 对于微秒延时,没有一个现成的函数,但是可以通过 QueryPerformanceFrequency QueryPerformanceCounter 来间接实现。原理就是...

开飞色
今天
1
0
log4j2使用AsyncRoot不显示行号问题处理

<AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="File"/></AsyncRoot><!--1.异步logger,还需要在pom.xml中添加disruptor的依赖。2.includeLocation结合异......

小翔
今天
3
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
今天
2
0
使用token实现在有效期内APP自动登录功能

使用token实现在有效期内APP自动登录功能 http://sevennight.cc/2016/07/19/auto_login_impl.html

风云海滩
今天
3
0
Spring Boot集成RabbitMQ发送接收JSON

默认情况下RabbitMQ发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。 ObjectMapper 最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送...

小致dad
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部