您的位置:首页 > 移动开发 > Android开发

Android Notification详解

2014-02-18 16:13 309 查看
Notification,俗称通知,是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。

关于Notification的详细介绍可参考Android Developer Notifications

Notification视觉风格

Notification有两种视觉风格,一种是标准视图(Normal view)、一种是大视图(Big view)。标准视图在Android中各版本是通用的,但是对于大视图而言,仅支持Android4.1+的版本。

标准视图



标准视图显示的大小要保持在64dp高,宽度为屏幕标准。标准视图的通知主体内容有一下几个:

通知标题。
大图标。
通知内容。
通知消息。
小图标。
通知的时间,一般为系统时间,也可以使用setWhen()设置。

大视图

大视图(Big View)而言,它的细节区域只能显示256dp高度的内容,并且只对Android4.1+之后的设备才支持,它比标准视图不一样的地方,均需要使用setStyle()方法设定,它大致的效果如下:



大视图和标准视图几乎一样,唯一的不同在7 细节部分。每个大视图可将此部分设置成不同样式。可供选择的样式如下:

Big picture style

在细节部分显示一个256dp高度的位图。

Big text style

在细节部分显示一个大的文本块。

Inbox style

在细节部分显示一段行文本。

下面通过一个Demo来实现上述的通知效果,源码可通过文章末尾的链接进行下载。





activity_main.xml

[html] view
plaincopy





<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity"

android:orientation="vertical">

<Button

android:id="@+id/bt_notify"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/notification" />

<Button

android:id="@+id/bt_notify_bigview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/notification_bigview" />

<Button

android:id="@+id/bt_notify_progress"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/notification_progress" />

<Button

android:id="@+id/bt_notify_custom"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/notification_custom" />

</LinearLayout>

MainActivity.java

[java] view
plaincopy





package com.example.notificationtest;

import android.app.Activity;

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.os.Bundle;

import android.support.v4.app.NotificationCompat;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.RemoteViews;

public class MainActivity extends Activity implements OnClickListener {

private static final String TAG = MainActivity.class.getSimpleName();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findView();

}

private void findView() {

Button bt_notify = (Button) findViewById(R.id.bt_notify);

Button bt_notify_bigview = (Button) findViewById(R.id.bt_notify_bigview);

Button bt_notify_progress = (Button) findViewById(R.id.bt_notify_progress);

Button bt_notify_custom = (Button) findViewById(R.id.bt_notify_custom);

bt_notify.setOnClickListener(this);

bt_notify_bigview.setOnClickListener(this);

bt_notify_progress.setOnClickListener(this);

bt_notify_custom.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.bt_notify:

issueSimpleNotification();

break;

case R.id.bt_notify_bigview:

issueBigViewNotification();

break;

case R.id.bt_notify_progress:

issueProgressNotification();

break;

case R.id.bt_notify_custom:

issueNotificationCustom();

break;

default:

break;

}

}

private void issueBigViewNotification() {

NotificationCompat.Builder mBuilder =

new NotificationCompat.Builder(this)

.setSmallIcon(R.drawable.ic_stat_notification)

.setContentTitle("6 new messages")

.setContentText("twain@android.com")

.setStyle(new NotificationCompat.InboxStyle()

.addLine("M.Twain (Google+) Haiku is more than a cert...")

.addLine("M.Twain Reminder")

.addLine("M.Twain Lunch?")

.addLine("M.Twain Revised Specs")

.addLine("M.Twain ")

.addLine("Google Play Celebrate 25 billion apps with Goo..")

.addLine("Stack Exchange StackOverflow weekly Newsl...")

.setBigContentTitle("6 new message")

.setSummaryText("mtwain@android.com"))

.setTicker("New message")//第一次提示消息的时候显示在通知栏上

.setNumber(15)

.setAutoCancel(true);//自己维护通知的消失

Intent resultIntent = new Intent(this, NotifyActivity.class);

resultIntent.putExtra("msg", "Big View Notification Test");

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent resultPendingIntent =

PendingIntent.getActivity(

this,

0,

resultIntent,

PendingIntent.FLAG_UPDATE_CURRENT

);

//Set the Notification's Click Behavior

mBuilder.setContentIntent(resultPendingIntent);

// Sets an ID for the notification

int mNotificationId = 15;

// Gets an instance of the NotificationManager service

NotificationManager mNotifyMgr =

(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// Builds the notification and issues it.

mNotifyMgr.notify(mNotificationId, mBuilder.build());

}

/**

* Custom Notification Layouts

*/

private void issueNotificationCustom() {

// 1、创建一个自定义的消息布局 view.xml

// 2、在程序代码中使用RemoteViews的方法来定义image和text。然后把RemoteViews对象传到contentView字段

RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.custom_notification);

remoteView.setImageViewResource(R.id.iv_icon, R.drawable.ic_launcher);

remoteView.setTextViewText(R.id.tv_title , "Custom Notification Layout");

remoteView.setProgressBar(R.id.pb_progress, 100, 75, false);

Intent resultIntent = new Intent(this, NotifyActivity.class);

resultIntent.putExtra("msg", "This is a Custom Notification Layout");

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent resultPendingIntent =

PendingIntent.getActivity(

this,

0,

resultIntent,

PendingIntent.FLAG_UPDATE_CURRENT

);

NotificationCompat.Builder mBuilder =

new NotificationCompat.Builder(this)

.setSmallIcon(R.drawable.ic_launcher)

.setContentTitle("Custom Notification Layout")

.setContent(remoteView)

.setContentIntent(resultPendingIntent)

.setDefaults(Notification.DEFAULT_ALL)

.setTicker("new message");

// Sets an ID for the notification

int mNotificationId = 12;

// Gets an instance of the NotificationManager service

NotificationManager mNotifyMgr =

(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// Builds the notification and issues it.

mNotifyMgr.notify(mNotificationId, mBuilder.build());

}

/**

* 带进度条的 Notification

*/

private void issueProgressNotification() {

final NotificationCompat.Builder mBuilder =

new NotificationCompat.Builder(this)

.setSmallIcon(R.drawable.ic_stat_notification)

.setContentTitle("Picture Download")

.setContentText("Download in progress");

// Sets an ID for the notification

final int mNotificationId = 11;

// Gets an instance of the NotificationManager service

final NotificationManager mNotifyManager =

(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// Start a lengthy operation in a background thread

new Thread(

new Runnable() {

@Override

public void run() {

int incr;

// Do the "lengthy" operation 20 times

for (incr = 0; incr <= 100; incr+=5) {

// Sets the progress indicator to a max value, the

// current completion percentage, and "determinate"

// state

mBuilder.setProgress(100, incr, false);

// Displays the progress bar for the first time.

mNotifyManager.notify(mNotificationId, mBuilder.build());

// Sleeps the thread, simulating an operation

// that takes time

try {

// Sleep for 5 seconds

Thread.sleep(1000);

} catch (InterruptedException e) {

Log.d(TAG, "sleep failure");

}

}

// When the loop is finished, updates the notification

mBuilder.setContentText("Download complete")

// Removes the progress bar

.setProgress(0,0,false);

mNotifyManager.notify(mNotificationId, mBuilder.build());

}

}

// Starts the thread by calling the run() method in its Runnable

).start();

}

/**

* 简单的 Notification

*/

private void issueSimpleNotification() {

Bitmap btm = BitmapFactory.decodeResource(getResources(),

R.drawable.ic_stat_notification);

NotificationCompat.Builder mBuilder =

new NotificationCompat.Builder(this)

.setSmallIcon(R.drawable.ic_stat_notification)

.setLargeIcon(btm)

.setContentTitle("Simple Notification Test")

.setContentText("I am a Simple Notification")

// .setDefaults(Notification.DEFAULT_ALL) // requires VIBRATE permission

.setTicker("New message")//第一次提示消息的时候显示在通知栏上

.setNumber(15)

.setAutoCancel(true);//自己维护通知的消失

/*

* Clicking the notification itself displays ResultActivity, which provides

* UI for snoozing or dismissing the notification.

* This is available through either the normal view or big view.

*/

Intent resultIntent = new Intent(this, NotifyActivity.class);

resultIntent.putExtra("msg", "Simple Notification Test");

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

// Because clicking the notification opens a new ("special") activity, there's

// no need to create an artificial back stack.

PendingIntent resultPendingIntent =

PendingIntent.getActivity(

this,

0,

resultIntent,

PendingIntent.FLAG_UPDATE_CURRENT

);

//Set the Notification's Click Behavior

mBuilder.setContentIntent(resultPendingIntent);

// Sets an ID for the notification

int mNotificationId = 10;

// Gets an instance of the NotificationManager service

NotificationManager mNotifyMgr =

(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// Builds the notification and issues it.

mNotifyMgr.notify(mNotificationId, mBuilder.build());

}

}

为了保证最好的兼容性,通过NotificationCompat及其子类来创建Notification,明确说是NotificationCompat.Builder,它位于support v4包中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: