分类
Android的notification有以下几种:
1>普通notification
图1
-
标题,通过NotificationCompat.Builder.setContentTitle(String title)来设置
-
大图标,通过NotificationCompat.Builder.setLargeIcon(Bitmap icon)来设置
-
内容,通过NotificationCompat.Builder.setContentText("ContentText")来设置
-
内容附加信息,通过NotificationCompat.Builder.setContentInfo("ContentInfo")来设置
-
小图标,通过NotificationCompat.Builder.setSmallIcon(int icon)来设置
-
时间,通过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>初始化部分代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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
1
2
3
4
5
6
7
8
9
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
并对中间的播放按钮做了一个简单的点击处理事件:
1
2
3
4
5
6
7
8
9
10
11
|
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());
}
|
布局文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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();
}
|