android ——通知管理
1 public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 Button sendNotice = (Button) findViewById(R.id.button); 9 10 sendNotice.setOnClickListener(new View.OnClickListener() { 11 @Override 12 public void onClick(View view) { 13 14 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 15 16 Intent intent = new Intent(MainActivity.this,NoticeActivity.class); 17 PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); 18 19 Notification notification = new NotificationCompat.Builder(MainActivity.this) 20 .setContentTitle("这是一个标题") 21 .setContentText("这是一个内容") 22 .setWhen(System.currentTimeMillis()) 23 .setSmallIcon(R.mipmap.ic_launcher) 24 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) 25 .setContentIntent(pi) 26 .setDefaults(NotificationCompat.DEFAULT_ALL) 27 .build(); 28 manager.notify(1,notification); 29 } 30 }); 31 } 32 }
这一个较为完整的通知,首先呢:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
获取了一个NotificationManager的实例,NotificationManager是一个管理通知的类,可以通过getSystemService()方法来获取到,参数是用于确定获取系统的那个服务的一个字符串。
然后,使用了一个Buider构造器来创建一个notification对象,一般的使用方法如下:
Notification notification = new NotificationCompat.Builder(context).build();
这个代码只是创建了一个空的notification对象,可以在build()之连缀使用多个设置方法设置icon、文字、提示声音、振动等等参数。比如:
1 Notification notification = new NotificationCompat.Builder(MainActivity.this) 2 .setContentTitle("这是一个标题") 3 .setContentText("这是一个内容") 4 .setWhen(System.currentTimeMillis()) 5 .setSmallIcon(R.mipmap.ic_launcher) 6 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) 7 .setContentIntent(pi) 8 .setDefaults(NotificationCompat.DEFAULT_ALL) 9 .build();
其中:
setContentTitle()方法用于指定通知的标题内容;
setContentText()方法用于指定通知的正文内容;
setWhen()方法会在通知上显示通知被创建的时间(System.currentTimeMillis()这个方法将返回时间,以毫秒为单位);
setSmallIcon()用于指定小图标,不过这里只能使用纯alpha图层的图片,这个图标将显示在状态栏没有下拉的状态栏上;
setLargeIcon()用于指定大图标,下拉状态栏的时候就能看到大图标了
setContentIntent()这里传入一个PendingIntent类的对象用于指定点击通知后的相应。
setDefaults()这里指定了当通知显示的时候的效果,它会根据手机的环境来决定播放什么铃声,和如何振动。
最后:
manager.notify(1,notification);
使用NotificationManager的notify()方法让通知显示出来,第一个参数是一个id,要保证每个通知的id不同,第二个参数就是设置好的notification对象
具体效果就是:
想要实现点击的效果就需要一个PendingIntent类,它主要提供几种静态方法实现获取PendingIntent的实例,根据需求分别是getActivity(),getBroadcast(),getService(),比如这里使用的是:
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
getActivity(),getBroadcast(),getService()这三个方法的参数都是一个的,第一个参数是context,第二个通常是0,第三个是一个Intent对象,通过这个Intent对象可以构建出PendingIntent的意图,第四个参数用于确定PendingIntent的行为,通常有四种值可以选:
FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。
FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。
FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。
FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。
这里使用0即可。
Intent intent = new Intent(MainActivity.this,NoticeActivity.class);
这里传入的intent对象是这样一个启动NoticeActivity活动的,所以点击通知时会启动NoticeActivity活动。
对于通知的设置还可以在build()之使用这些方法:
1、播放声音
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ohh")))
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ohh")))
这个用于设置通知的声音;
2、振动
.setVibrate(new long[] {0, 1000, 1000, 1000})
这个用于设置通知的振动的参数是一个长整型的数组,下标0的值表示通知到来时手机静止的时长,下标1的值表示手机振动的时长,下标2的值又表示手机振动的时长,以此类推。通知这里表示通知到来时手机立即振动1秒,然后停止1秒,然后再振动1秒。
想要振动还需要权限
<uses-permission android:name="android.permission.VIBRATE"/>
3、LED
.setLights(Color.GREEN,1000,1000)
这个是设置通知到来时手机的LED灯,第一个参数是指定颜色,第二个参数指定亮起的时长,第二个是暗去的时长。
4、取消通知
.setAutoCancel(true)
这个是点击这个通知后这个通知就消失。这里还能调用NotificationManager的cacel()方法显式的取消这个通知,比如在这里可以在这个通知启动的活动中设置一个按钮然后调用这个方法,具体就是:
public class NoticeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notice); final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Button cacnel = (Button) findViewById(R.id.cancel); cacnel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { manager.cancel(1); } }); } }
manager.cancel(1)里面的参数就是通知的id。
5、大文本和大图片
.setContentText("这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容")
.setContentText()使用这个方法显示一个长文本的时候会显示不全。
这时候就需要使用setstyle()方法:
setStyle(new NotificationCompat.BigTextStyle().bigText("这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容这是一个内容"))
这里创建了一个NotificationCompat.BigTextStyle()对象,这个对象适用于封装长文本信息的,然后调用他的bigText()方法将文字内容传入。
与之类似,还可以显示一张大图片:
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.image_1)))
NotificationCompat.BigPictureStyle()这个对象用于设置大图片,然后调用它的bigPicture()方法将图片传入,然后通过调用BitmapFactory的decodeResource方法将图片解析为Bitmap对象。
6、通知的重要程度
通知的重要程度使用setPriority()方法,通常有个整型的常量值可选:PRIORITY_DEFAULT这是一个默认的重要程度,和不设置一样;PRIORITY_MIN,这表示系统旨在特定的情况才显示,比如下拉的时候;PRIORITY_LOW,系统可能会缩小这个通知,改变它的顺序,将其排在重要的通知的后面;PRIORITY_HIGH,会被系统放大,改变其顺序,将其排在比较靠前的位置;PRIORITY_MAX是最高的重要程度,系统会立即显示。比如:
.setPriority(NotificationCompat.PRIORITY_MAX)
当重要程度达到MAX时系统会弹出一个横幅立即显示这条通知,不过如果使用小米手机的话要自行开启悬浮通知的权限。。