Android Notification常见样式总结

本文总结一下开发中使用的Notification的常见样式
Demo下载地址
demo里有两首歌和打包后的apk,所以比较大,如果网不好下载请耐心!

代码中用的自定义常量

    public static final int TYPE_Normal = 1;
    public static final int TYPE_Progress = 2;
    public static final int TYPE_BigText = 3;
    public static final int TYPE_Inbox = 4;
    public static final int TYPE_BigPicture = 5;
    public static final int TYPE_Hangup = 6;
    public static final int TYPE_Media = 7;
    public static final int TYPE_Customer = 8;
    private NotificationManager manger = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

所需权限

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT"/>

一.普通通知

这是最常见通知样式,如下图
这里写图片描述
这里写图片描述

举例

private void simpleNotify(){
        //为了版本兼容  选择V7包下的NotificationCompat进行构造
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        //Ticker是状态栏显示的提示
        builder.setTicker("简单Notification");
        //第一行内容  通常作为通知栏标题
        builder.setContentTitle("标题");
        //第二行内容 通常是通知正文
        builder.setContentText("通知内容");
        //第三行内容 通常是内容摘要什么的 在低版本机器上不一定显示
        builder.setSubText("这里显示的是通知第三行内容!");
        //ContentInfo 在通知的右侧 时间的下面 用来展示一些其他信息
        //builder.setContentInfo("2");
        //number设计用来显示同种通知的数量和ContentInfo的位置一样,如果设置了ContentInfo则number会被隐藏
        builder.setNumber(2);
        //可以点击通知栏的删除按钮删除
        builder.setAutoCancel(true);
        //系统状态栏显示的小图标
        builder.setSmallIcon(R.mipmap.ic_launcher);
        //下拉显示的大图标
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push));
        Intent intent = new Intent(this,SettingsActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
        //点击跳转的intent
        builder.setContentIntent(pIntent);
        //通知默认的声音 震动 呼吸灯
        builder.setDefaults(NotificationCompat.DEFAULT_ALL);
        Notification notification = builder.build();
        manger.notify(TYPE_Normal,notification);
    }

build内提供了很多设置,但是在不同的系统版本显示有很多差异,使用时需要注意

 setTicker 通知到来时低版本上会在系统状态栏显示一小段时间 5.0以上版本好像没有用了
    setContentInfo和setNumber同时使用 number会被隐藏
    setSubText显示在通知栏的第三行文本,在低版本上不显示,比如4.0系统
    setVibrate设置震动 参数是个long[]{震动时长,间隔时长,震动时长,间隔时长...}单位毫秒 设置提醒声音 setSound(Uri sound) 一般默认的就好
    builder.setLights()设置呼吸灯的颜色 并不是所有颜色都被支持 个人感觉没什么用
    清除通知栏特定通知 manager.cancel(id) id即为manger.notify()的第一个参数

二.下载进度的通知

效果图
这里写图片描述
代码举例

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push));
        //禁止用户点击删除按钮删除
        builder.setAutoCancel(false);
        //禁止滑动删除
        builder.setOngoing(true);
        //取消右上角的时间显示
        builder.setShowWhen(false);
        builder.setContentTitle("下载中..."+progress+"%");
        builder.setProgress(100,progress,false);
        //builder.setContentInfo(progress+"%");
        builder.setOngoing(true);
        builder.setShowWhen(false);
        Intent intent = new Intent(this,DownloadService.class);
        intent.putExtra("command",1);
        Notification notification = builder.build();
        manger.notify(MainActivity.TYPE_Progress,notification);

注意事项

setProgress的第三个bool类型的参数表示progressbar的Indeterminate属性 指是否使用不确定模式
高版本上progressbar的进度值可以在setContentInfo显示,但是低版本上使用这个属性会导致progressbar不显示,setContentText一样

三.BigTextStyle通知

点击后展开可显示大段文字内容的通知
效果图
点击前
这里写图片描述
点击后
这里写图片描述

代码举例

private void bigTextStyle(){

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("BigTextStyle");
    builder.setContentText("BigTextStyle演示示例");
    builder.setSmallIcon(R.mipmap.ic_launcher);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
    android.support.v4.app.NotificationCompat.BigTextStyle style = new android.support.v4.app.NotificationCompat.BigTextStyle();
    style.bigText("这里是点击通知后要显示的正文,可以换行可以显示很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长");
    style.setBigContentTitle("点击后的标题");
    //SummaryText没什么用 可以不设置
    style.setSummaryText("末尾只一行的文字内容");
    builder.setStyle(style);
    builder.setAutoCancel(true);
    Intent intent = new Intent(this,SettingsActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
    builder.setContentIntent(pIntent);
    builder.setDefaults(NotificationCompat.DEFAULT_ALL);
    Notification notification = builder.build();
    manger.notify(TYPE_BigText,notification);
}

注意事项

使用类 android.support.v4.app.NotificationCompat.BigTextStyle
在低版本系统上只显示点击前的普通通知样式 如4.4可以点击展开,在4.0系统上就不行
点击前后的ContentTitle、ContentText可以不一致,bigText内容可以自动换行 好像最多5行的样子

四.InboxStyle

与bigTextStyle类似,点击前显示普通通知样式,点击后展开
效果图 (点击后)
这里写图片描述

代码举例

public void inBoxStyle(){
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("InboxStyle");
    builder.setContentText("InboxStyle演示示例");
    builder.setSmallIcon(R.mipmap.ic_launcher);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
    android.support.v4.app.NotificationCompat.InboxStyle style = new android.support.v4.app.NotificationCompat.InboxStyle();
    style.setBigContentTitle("BigContentTitle")
            .addLine("第一行,第一行,第一行,第一行,第一行,第一行,第一行")
            .addLine("第二行")
            .addLine("第三行")
            .addLine("第四行")
            .addLine("第五行")
            .setSummaryText("SummaryText");
    builder.setStyle(style);
    builder.setAutoCancel(true);
    Intent intent = new Intent(this,SettingsActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
    builder.setContentIntent(pIntent);
    builder.setDefaults(NotificationCompat.DEFAULT_ALL);
    Notification notification = builder.build();
    manger.notify(TYPE_Inbox,notification);
}

注意事项

使用类android.support.v4.app.NotificationCompat.InboxStyle
每行内容过长时并不会自动换行
addline可以添加多行 但是多余5行的时候每行高度会有截断
同BigTextStyle 低版本上系统只能显示普通样式

五.BigPictureStyle

点击后可以显示一个大图的通知
效果图(点击后)
这里写图片描述
代码举例

public void bigPictureStyle(){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(“BigPictureStyle”);
builder.setContentText(“BigPicture演示示例”);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
android.support.v4.app.NotificationCompat.BigPictureStyle style = new android.support.v4.app.NotificationCompat.BigPictureStyle();
style.setBigContentTitle(“BigContentTitle”);
style.setSummaryText(“SummaryText”);
style.bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.small));
builder.setStyle(style);
builder.setAutoCancel(true);
Intent intent = new Intent(this,ImageActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
//设置点击大图后跳转
builder.setContentIntent(pIntent);
Notification notification = builder.build();
manger.notify(TYPE_BigPicture,notification);
}

注意事项

使用类android.support.v4.app.NotificationCompat.BigPictureStyle
style.bigPicture传递的是个bitmap对象 所以也不应该传过大的图 否则会oom
同BigTextStyle 低版本上系统只能显示普通样式

六.hangup横幅通知

类似于手机QQ消息的通知,不显示在通知栏而是以横幅的模式显示在其他应用上方

效果图
这里写图片描述

代码示例

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(“横幅通知”);
builder.setContentText(“请在设置通知管理中开启消息横幅提醒权限”);
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
Intent intent = new Intent(this,ImageActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
builder.setContentIntent(pIntent);
//这句是重点
builder.setFullScreenIntent(pIntent,true);
builder.setAutoCancel(true);
Notification notification = builder.build();
manger.notify(TYPE_Hangup,notification);

注意事项

此种效果只在5.0以上系统中有效
mainfest中需要添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
可能还需要在设置开启横幅通知权限(在设置通知管理中)
在部分改版rom上可能会直接弹出应用而不是显示横幅

七.MediaStyle

主要是用来关联音频播放服务的,点击后不会自动消失,通知栏的清空也不可用
效果图
点击前
这里写图片描述
点击展开后
这里写图片描述
在4.0系统上的效果 不能展开但是可以最多显示3个按钮外加一个CancelButton
这里写图片描述
代码示例

private void mediaStyle(){
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("MediaStyle");
    builder.setContentText("Song Title");
    builder.setSmallIcon(R.mipmap.ic_launcher);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
    builder.setDefaults(NotificationCompat.DEFAULT_ALL);
    Intent intent = new Intent(this,ImageActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
    builder.setContentIntent(pIntent);
    //第一个参数是图标资源id 第二个是图标显示的名称,第三个图标点击要启动的PendingIntent
    builder.addAction(R.drawable.ic_previous_white,"",null);
    builder.addAction(R.drawable.ic_stop_white,"",null);
    builder.addAction(R.drawable.ic_play_arrow_white_18dp,"",pIntent);
    builder.addAction(R.drawable.ic_next_white,"",null);
    NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle();
    style.setMediaSession(new MediaSessionCompat(this,"MediaSession",
            new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
    //CancelButton在5.0以下的机器有效
    style.setCancelButtonIntent(pIntent);
    style.setShowCancelButton(true);
    //设置要现实在通知右方的图标 最多三个
    style.setShowActionsInCompactView(2,3);
    builder.setStyle(style);
    builder.setShowWhen(false);
    Notification notification = builder.build();
    manger.notify(TYPE_Media,notification);
}

注意事项

使用类v7包下的NotificationCompat.MediaStyle
addAction方法并普通样式也可以用,使用后普通通知可以点击展开,展开部分会显示一排添加的图标,并且可以给每个图标设置不同的点击事件
最多可以添加5哥action 并排显示在点击展开的部分
setShowActionsInCompactView的参数是添加的action在所有action组成的数组中的下标,从0开始
setShowActionsInCompactView设置的action会显示在点击前的通知的右侧,低版本上也可以显示
setShowCancelButton(true)会在通知的右上部分显示一个删除图标 5.0以下有效

八.自定义通知栏布局

其实就是设置一个romateViews
演示效果
这里写图片描述
代码示例

//command是自定义用来区分各种点击事件的
private void sendCustomerNotification(int command){
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("Notification");
    builder.setContentText("自定义通知栏示例");
    builder.setSmallIcon(R.mipmap.ic_launcher);
    //builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push));
    builder.setAutoCancel(false);
    builder.setOngoing(true);
    builder.setShowWhen(false);
    RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.notification_template_customer);
    remoteViews.setTextViewText(R.id.title,"Notification");
    remoteViews.setTextViewText(R.id.text,"song"+index);
    if(command==CommandNext){
        remoteViews.setImageViewResource(R.id.btn1,R.drawable.ic_pause_white);
    }else if(command==CommandPlay){
        if(playerStatus==StatusStop){
            remoteViews.setImageViewResource(R.id.btn1,R.drawable.ic_pause_white);
        }else{
            remoteViews.setImageViewResource(R.id.btn1,R.drawable.ic_play_arrow_white_18dp);
        }
    }
    Intent Intent1 = new Intent(this,MediaService.class);
    Intent1.putExtra("command",CommandPlay);
    //getService(Context context, int requestCode, @NonNull Intent intent, @Flags int flags)
    //不同控件的requestCode需要区分开 getActivity broadcoast同理
    PendingIntent PIntent1 =  PendingIntent.getService(this,5,Intent1,0);
    remoteViews.setOnClickPendingIntent(R.id.btn1,PIntent1);

    Intent Intent2 = new Intent(this,MediaService.class);
    Intent2.putExtra("command",CommandNext);
    PendingIntent PIntent2 =  PendingIntent.getService(this,6,Intent2,0);
    remoteViews.setOnClickPendingIntent(R.id.btn2,PIntent2);

    Intent Intent3 = new Intent(this,MediaService.class);
    Intent3.putExtra("command",CommandClose);
    PendingIntent PIntent3 =  PendingIntent.getService(this,7,Intent3,0);
    remoteViews.setOnClickPendingIntent(R.id.btn3,PIntent3);

    builder.setContent(remoteViews);
    Notification notification = builder.build();
    manger.notify(MainActivity.TYPE_Customer,notification);
}

布局文件

时间: 2025-01-19 05:22:42

Android Notification常见样式总结的相关文章

属于自己的常见Android选项菜单样式集合_Android

菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是OptionsMenu 一.概述 public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu . public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作. pu

Android Notification (转)

        上回我们提到在4.0ICS之后,Google为Android平台的Notification这把"倚天剑"注入了更多新鲜的元素,使其更加实用美观.Notification的样式从此变得丰富起来,以适应于不同情景的需要.就像最近非常流行的神曲<江南style>一样,在世界各个角落出现了各种方言的版本,为不同肤色.民族.信仰的人们所接受和喜欢.本文我们就来耍耍这把"倚天剑"的各种style--各种样式的通知. 一个通知就是一条消息,显示在你的应

Android Notification详解

Android Notification通知详细介绍 目录介绍 1.Notification简单概述 2.Notification通知用途 3.Notification的基本操作 3.1 Notification创建必要的属性 3.2 Notification简单创建步骤 3.3 关于setSmallIcon()与setLargeIcon()区别 3.4 Notification的Action属性[交互作用] 3.5 更新Notification 3.6 取消Notification 3.7 设

浅析Android中常见三种弹框在项目中的应用

一丶概述 弹框在Android项目中经常出现,常见的实现方法有三种:Dialog 弹框,Window弹框,Activity伪弹框.本文就说一说三种弹框的实现及在项目中的运用. 二丶演示图 图一为常见的三种弹框(文末上链接),图二为项目中用到的Activity伪弹框 三丶正文 1.Dialog弹框 先看一篇一篇文章: android 8种对话框(Dialog)使用方法汇总 Dialog是系统自带的弹框,然而常常因为UI不好看而遭嫌弃,常需要自定义 public class MyDialog ext

修改Android应用的样式的一些关键点解析_java

android中可以自定义主题和风格.风格,也就是style,我们可以将一些统一的属性拿出来,比方说,长,宽,字体大小,字体颜色等等.可以在res/values目录下新建一个styles.xml的文件,在这个文件里面有resource根节点,在根节点里面添加item项,item项的名字就是属性的名字,item项的值就是属性的值,如下所示: <?xml version="1.0" encoding="utf-8"?> <resources> &

android自定义switch样式

问题描述 android自定义switch样式 原生的switch显示text只能在thumb上,自己替换thumb和track的时候swtich会根据thumb大小改变宽度,但我想在switch内写on/off,而不是在thumb上,在4.0以上系统就可以,安卓小白,不知道怎么弄.. 解决方案 效果如图 自定义组件CheckSwitchButton.Java 放在View文件下 package com.haiyisoft.teamassistant.view; import com.haiyi

Android AlertDialog自定义样式实现代码_Android

Android AlertDialog自定义样式 像列表这种选择项的弹出式对话框,要改变样式一般都采取重写layout方式 今天才了解到 其实可以自定义样式,与大家分享下,其实很简单 AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom)); 然后自定义自己的样式就可以了 <?xml version="1.0" en

Android Notification 的使用

" Android Notification 的使用 " 的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例.当然重点便是如何设置该 Activity 的 launchMode 与 Intent 的 Flags 了,说到这里,我不得不说一下今晚的调试经历,当然这里所说的所有的Notification都设置了FLAG_ONGOING_EVENT

Android Notification通知解析_Android

Notification是显示在手机状态栏的通知,Notification通知是具有全局性的通知,一般通过NotificationManager来进行管理. 一般运用Notification的步骤如下: 1.调用getSysytemService(NOTIFICATION_SERVICE)来获取系统的NotificationManager,进行Notification的发送和回收 2.通过构造器建立一个Notification 3.为Notification set各种属性,然后builder(