这是最多见通知样式,以下图 java
默认样式,包括一个标题和一个内容,内容只显示一行 ,多余的内容会以省略号替代。android
效果图:(第三行内容在低版本不必定显示)数组
//为了版本兼容 选择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(); (NotificationManager) getSystemService(NOTIFICATION_SERVICE).notify(TYPE_Normal,notification);
注意:app
build内提供了不少设置,可是在不一样的系统版本显示有不少差别,使用时须要注意less
效果图:布局
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(); (NotificationManager) getSystemService(NOTIFICATION_SERVICE).notify(MainActivity.TYPE_Progress,notification);
注意事项
1. setProgress的第三个bool类型的参数表示progressbar的Indeterminate属性 指是否使用不肯定模式
2. 高版本上progressbar的进度值能够在setContentInfo显示,可是低版本上使用这个属性会致使progressbar不显示,setContentText同样ui
点击(
不一样机型的操做可能不一样)后展开可显示大段文字内容的通知
效果图
点击前 (不一样机型的操做可能不一样,一些机型是两只手指同时向上向下拉,一些是直接下拉)
this
操做后:spa
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(); (NotificationManager) getSystemService(NOTIFICATION_SERVICE).notify(TYPE_BigText,notification);
注意事项
1. 使用类 android.support.v4.app.NotificationCompat.BigTextStyle
2. 在低版本系统上只显示点击前的普统统知样式 如4.4能够点击展开,在4.0系统上就不行
3. 点击先后的ContentTitle、ContentText能够不一致,bigText内容能够自动换行 好像最多5行的样子设计
与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) }
注意事项
1. 使用类android.support.v4.app.NotificationCompat.InboxStyle
2. 每行内容过长时并不会自动换行
3. addline能够添加多行 可是多余5行的时候每行高度会有截断
4. 同BigTextStyle 低版本上系统只能显示普通样式
点击后能够显示一个大图的通知
效果图(点击后)
代码举例
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) }
注意事项
1. 使用类android.support.v4.app.NotificationCompat.BigPictureStyle
2. style.bigPicture传递的是个bitmap对象 因此也不该该传过大的图 不然会oom
3. 同BigTextStyle 低版本上系统只能显示普通样式
相似于手机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)
注意事项
1. 此种效果只在5.0以上系统中有效
2. mainfest中须要添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
3. 极可能还须要在设置开启横幅通知权限(在设置通知管理中)
4. 在部分改版rom上可能会直接弹出应用而不是显示横幅
主要是用来关联音频播放服务的,点击后不会自动消失,通知栏的清空也不可用
效果图
点击前
点击展开后
在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) }
注意事项
1. 使用类v7包下的NotificationCompat.MediaStyle
2. addAction方法并普通样式也能够用,使用后普统统知能够点击展开,展开部分会显示一排添加的图标,而且能够给每一个图标设置不一样的点击事件
3. 最多能够添加5哥action 并排显示在点击展开的部分
4. setShowActionsInCompactView的参数是添加的action在全部action组成的数组中的下标,从0开始
5. setShowActionsInCompactView设置的action会显示在点击前的通知的右侧,低版本上也能够显示
6. 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) }
布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/status_bar_latest_event_content" android:layout_width="match_parent" android:layout_height="64dp" android:gravity="center_vertical" android:orientation="horizontal"></linearlayout> <imageview android:id="@+id/icon" android:layout_width="64dp" android:layout_height="50dp" android:scaletype="fitCenter" android:src="@drawable/push"></imageview> <linearlayout android:orientation="vertical" android:paddingright="8dp" android:paddingend="8dp" android:paddingtop="2dp" android:paddingbottom="2dp" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content"></linearlayout> <textview android:id="@+id/title" android:textappearance="@style/TextAppearance.StatusBar.EventContent.Title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleline="true" android:layout_marginleft="2dp" android:layout_marginstart="2dp" android:paddingtop="6dp" android:paddingbottom="6dp" android:ellipsize="marquee" android:fadingedge="horizontal" android:layout_weight="1" android:text="Title"></textview> <textview android:id="@+id/text" android:textappearance="@style/TextAppearance.StatusBar.EventContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginleft="2dp" android:layout_marginstart="2dp" android:singleline="true" android:text="Content" android:ellipsize="marquee" android:fadingedge="horizontal"></textview> <linearlayout android:id="@+id/media_actions" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical|end" android:orientation="horizontal" android:layoutdirection="ltr"></linearlayout> <imagebutton style="?android:attr/borderlessButtonStyle" android:id="@+id/btn1" android:layout_width="48dp" android:layout_height="match_parent" android:layout_marginleft="2dp" android:layout_marginright="2dp" android:layout_weight="1" android:src="@drawable/ic_play_arrow_white_18dp" android:gravity="center"></imagebutton> <imagebutton style="?android:attr/borderlessButtonStyle" android:id="@+id/btn2" android:layout_width="48dp" android:layout_height="match_parent" android:layout_marginleft="2dp" android:layout_marginright="2dp" android:layout_weight="1" android:src="@drawable/ic_next_white" android:gravity="center"></imagebutton> <imagebutton style="?android:attr/borderlessButtonStyle" android:id="@+id/btn3" android:layout_width="48dp" android:layout_height="match_parent" android:layout_marginleft="2dp" android:layout_marginright="2dp" android:layout_weight="1" android:src="@drawable/abc_ic_clear_mtrl_alpha" android:gravity="center"></imagebutton> <imageview android:id="@+id/end_padder" android:layout_width="6dp" android:layout_height="match_parent"></imageview>
注意事项 1. 不一样控件 PendingIntent.getXXX的requestCode不能相同 2. RemoteViews的具体用法请自行百度 这里就不展开说明了 3. 自定义布局的高须要是64dp 没有为何 官方给的 4. 须要更改通知栏布局的时候 其实就是以同一个NotifyId发个新的通知 替换掉老的 5. LargeIcon能够不设置,可是smallIcon和title须要设置,否则通知不能显示 6. LargeIcon若是设置了而且自定义布局内相同位置还有一个icon的画在低版本系统上可能会都显示,高版本不会显示LargeIcon