一:Notification的简介==
Notification是显示在手机状态栏的通知,手机状态栏位于手机屏幕的最上方,那里一般
显示了手机当前的网络状态,电池状态,时间等。
Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification.Android3.0增加Notification.Builder类,通过该类允许开发者更轻松地创建Notification对象。
Notification普通视图
Notification大视图
二:Notification使用的步骤:
a)获取NotificationManager对象
NotificationManager nm =getSystemService(NOTIFICATION_SERVICE);
b)创建Notification对象,有如下步骤:
1)获取Notification.Builder对象
2)调用Notification.Builder的setXXX方法设置属性.
其中的属性并不是全部设置,但是必须设置三项
setSmallIcon(),setContentText(),setCotentTitle()。
3)调用Notification.Builder的build方法创建Notification对象(Android API 16之后)
c)通过NotificationManager发送Notification
nm.notify(index,Notification);
注意:取消通知nm.cancel(index)
1)常用的属性方法:
setContentText():设置通知内容
setSamllIcon():为通知设置小图标
setContentTitle():设置通知标题
builder.setTicker(“这是一条新闻通知”); 设置通知在状态栏里面的标题
setLargeIcon():为通知设置大图标,使用BitmapFactory创建图片。
Bitmap btm=BitmapFactory.decodeResource(getResources(),R.drawable.msg);
setWhen(System.currentTimeMillis())设置时间
setContentIntent():设置点击通知后将要启动的程序组件对应的PendingIntent。
setAutoCancel():设置点击通知后,状态自动删除通知
setContentInfo()设置通知信息
2)设置提示响应方法:
setDefaults():设置通知为默认音效、振动、闪屏.
Notification.DEFAULT_SOUND:使用默认声音
Notification.DEFAULT_VIBRATE:设置默认振动
Notification.DEFAULT_LIGHTS:设置使用默认闪光灯
Notification.DEFAULT_ALL:设置使用默认声音,振动,闪光灯
setSound(Uri.parse(“file:///sdcard/apple.mp3”)):设置自定义声音
setVibrate(new long[]{1000,5000,1000,3000}):设置自定义振动.时长的单位是毫秒.数组中数字的含义依次是[静止时长,震动时长,静止时长,震动时长..]
setLights(int argb, int onMs, int offMs):设定前置LED灯的闪烁速率,持续毫秒数,停顿毫秒数
注意:需要添加闪光灯和振动器的权限
android.permission.FALSHLIGHT
android.permission.VIBRATE
3)进度条样式的通知:
setProgress(int max,int progress,boolean indeterminate)方法用于设置进度条,
max用于设定进度的最大数,
progress用于设定当前的进度,=
indeterminate用于是否是一个确定进度值的进度条。
通过indeterminate的设置,可以实现两种不同样式的进度条,一种是有进度的(false),一种是循环流动的(true)。
3)Notification视觉风格:
Notification有两种视觉风格,
一种是标准视图(Normal view)、一种是大视图(Big view)。标准视图在Android中各版本是通用的,但是对于大视图而言,仅支持Android4.1+的版本。
从官方文档了解到,一个标准视图显示的大小要保持在64dp高,
宽度为屏幕标准。标准视图的通知主体内容有一下几个p1.png;
a)通知标题。
b)大图标。
c)通知内容。
d)通知消息。
e)小图标。
f)通知的时间,一般为系统时间,也可以使用setWhen()设置.
而对于大视图(Big View)而言,它的细节区域只能显示256dp高度的内容,并且只对Android4.1+之后的设备才支持,使用NotificationCompat.Builder来创建通知和设置通知的属性。
它比标准视图不一样的地方,
均需要使用setStyle()方法设定,它大致的效果如p2.png:
setStyle()传递一个NotificationCompat.Style对象,它是一个抽象类,Android为我们提供了三个实现类,用于显示不同的场景。分别是:
NotificationCompat.BigPictureStyle, 在细节部分显示一个256dp高度的位图。
NotificationCompat.BigTextStyle,在细节部分显示一个大的文本块。
NotificationCompat.InboxStyle,在细节部分显示一段行文本。
如果仅仅显示一个图片,使用BigPictureStyle是最方便的;
如果需要显示一个富文本信息,则可以使用BigTextStyle;
如果仅仅用于显示一个文本的信息,那么使用InboxStyle即可。
后面会以一个示例来展示InboxStyle的使用,
该内部类中的方法addLine()添加一行
setBigContentTitle:设置标题
setSummaryText:设置落名
4)自定义通知:
setContent(RemoteViews view)可以自定义view.
但是对于通知而言,因为它的全局性,并不能简单的通过inflate获取出一个View,因为可能触发通知的时候,响应的App已经关闭,无法获取当指定的XML布局文件。所以需要使用单独的一个RemoteViews类来操作。
RemoteViews,描述了一个视图层次的结构,可以显示在另一个进程。层次结构也是从布局文件中“获取”出一个视图,这个类,提供了一些基本的操作求改其布局的内容。
RemoteViews提供了多个构造函数,一般使用RemoteViews(String packageName,int layoutId)。
第一个参数为包的名称,第二个为layout资源的Id。
当获取到RemoteViews对象之后,可以使用它的一系列setXxx()方法通过控件的Id设置控件的属性。
package com.xspacing.notification;
import android.annotation.SuppressLint;
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.view.View;
/**
*
* @ClassName MainActivity.java
* @Description notification通知
* @author smile
* @version v1.0
* @date 2016年10月10日
*/
public class MainActivity extends Activity {
private NotificationManager notificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public void sendMessage1(View v) {
// 获取通知管理者
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
// 必须设置的三个属性:setSmallIcon(小图标),setContentText(内容).setContentTitle(内容标题)
// 如果大图标区没有设置,默认是小图标的图片
builder.setSmallIcon(R.drawable.icon_150);
builder.setContentText("智慧北京于2016,7.8上线啦啦啦啦啦了!");
builder.setContentTitle("智慧北京");
// 设置声音
builder.setDefaults(Notification.DEFAULT_SOUND);
// 设置在通知栏显示的信息
builder.setTicker("重大通知!!!!");
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
// 设置大图标
builder.setLargeIcon(mBitmap);
// 设置通知信息
builder.setContentInfo("要闻");
// builder.setSubText("要闻");
// 点击跳转,PendingIntent延迟意图
PendingIntent pi=PendingIntent.getActivity(this, 1, new
Intent(this,SencondActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pi);
//设置点击完通知后,其自动消失
builder.setAutoCancel(true);
Notification notification = builder.build();
notificationManager.notify(1, notification);
}
public void sendMessage2(View v) {
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder builder=new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.icon_150);
builder.setContentTitle("标题");
NotificationCompat.InboxStyle is=new NotificationCompat.InboxStyle();
is.setBigContentTitle("第二标题");
is.addLine("1111111");
is.addLine("2111111");
is.addLine("3111111");
is.addLine("4111111");
//设置签名
is.setSummaryText("www.baidu.com");
builder.setStyle(is);
Notification notification = builder.build();
notificationManager.notify(2, notification);
}
public void sendMessage3(View v) {
notificationManager.cancel(2);
}
}
package com.xspacing.notification;
import android.app.Activity;
import android.os.Bundle;
/**
*
* @ClassName SencondActivity.java
* @Description 点击通知跳转到的activity
* @author smile
* @version v1.0
* @date 2016年10月10日
*/
public class SencondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
activity_main.xml
<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"
android:orientation="vertical"
tools:context="com.xspacing.notification.MainActivity" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendMessage1"
android:text="发送标准视图通知" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendMessage2"
android:text="发送大视图通知" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendMessage3"
android:text="取消" />
</LinearLayout>
activity_second.xml
<RelativeLayout 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="com.xspacing.notification.MainActivity" >
<TextView
android:text="secondActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout><RelativeLayout 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="com.xspacing.notification.MainActivity" >
<TextView
android:text="secondActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>