通知(Notification)

通知(Notification)是Android系统中比较有特色的功能,当某个程序希望用户发出一些提示信息,而该应用程序又不在前台时,就可以借助通知来实现。

首先创建一个NotificationManager来对通知进行管理。

 NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

接下来需要使用一个Builder构造器来创建Notification对象。

NotificationManager manager = getSystemService(Context.NOTIFICATION_SERVICE);

上述代码只是创建了一个空的Notification对象,并没有什么实际作用。我们可以在最终的build()方法之前任意多的设置方法创建一个丰富的Notification对象。

  Button sendNotice = (Button) findViewById(R.id.send_notice);
        sendNotice.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(MainActivity.this)
                        .setContentTitle("content title")
                        .setContentText("content text")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                        .build();
                manager.notify(1,notification);
            }
        });

setContentTitle()用于指定标题内容
setContentText()方法用于指定通知的正文内容
setWhen()指定被创建时间
setSmallIcon()通知小图标
setLargeIcon()设置通知的大图标
manager.notify(1, notification)让通知显示出来

这里写图片描述

点击按钮会出现通知,点击这条通知会发现没有任何效果。
PendingIntent 解决这个问题
这里写图片描述

PendingIntent
PendingIntent从名字上看起来和Intent有些类似,它们都可以指定一个“意图”,都可以用于启动活动,启动服务以及发送广播。不同的是Intent更加倾向于立即执行某个动作。PendingIntent更加倾向于在某个合适的时机去执行某个动作。也可以吧PendingIntent理解于延迟的Intent。

pendingIntent提供了几个静态方法获取PendingIntent的实例。
可以根据需求使用getActivity()方法,getBroadcast(),getService()方法。
这几个方法所接收的参数相同。第一个参数依旧是Context。第二个参数一般用不了,通常传入0。第三个参数是Intent对象,可以通过这个对象构建出PendingIntent的“意图”。第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT,FLAG_ON_CREATE,FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT四种值可选。一般传入0即可。
NotificationCompat.Builder这个构造器再连缀一个setContentIntent()方法,接受参数就是PendingIntent对象。

 Button sendNotice = (Button) findViewById(R.id.send_notice);
        sendNotice.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
                PendingIntent pi = PendingIntent.getActivity(MainActivity.this,0,intent,0);
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(MainActivity.this)
                        .setContentTitle("content title")
                        .setContentText("content text")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                        .setContentIntent(pi)
                        .build();
                manager.notify(1,notification);
            }
        });

这里写图片描述

又发现了一个问题!点击了通知栏,但是通知图标没有消失。是这样的,如果没有在代码中对该通知进行取消,它就会一直显示在系统的状态栏上。
解决方法有两种,一种是在NotificationCompat.Builder中连缀一个setAutoCancel()方法,另一种是显示的调用NotificationManager的cancel()方法将它取消。

第一种方法

 Notification notification = new NotificationCompat.Builder(MainActivity.this)
                        .setAutoCancel(true)
                        ...

第二种

 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                ...
                manager.notify(1,notification);
                manager.cancel(1);

这个1就是给每个通知栏指定的id。

设置音频:

.setSound(Uri.fromFile("/system/media/audio/ringtones/luna.org"))

设置震动:

.setVibrate(new long[]{0,1000,1000,1000})

AndroidManifest.xml:

<uses-permission android:name="android.permission.VIBRATE"/>

下标为0表示手机静止时长,下标为1表示手机震动时长,下表为2表示手机静止时长,下表为3表示手机震动时长,以此类推。

设置LED灯:

.setLights(Color.GREEN, 1000, 1000)

第一个参数设置LED灯颜色,第二个参数设置LED灯亮起的时长,第三个参数表示LED灯暗去的时长。

根据环境默认设置播放铃声,震动:

.setDefaults(NotificationCompat.DEFAULT_ALL)

显示一长段文字:

.setStyle(new NotificationCompat.BigTextStyle().bigText(
                                "HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!" +
                                "HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!" +
                                "HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!"))

创建一个NotificationCompat.BigTextStyle对象,这个对象就是用于封装长文字信息的。然后调用它的bigText()方法并将文字内容传入就可以。

显示大图片:

 .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(
                                BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)))

创建一个NotificationCompat.BigPictureStyle对象,这个对象就是用于设置大图片的,然后调用它的bigPicture()方法将图片传入。BitmapFactory的decodeResource()方法将图片解析为Bitmap对象。

设置重要程度:

.setPriority(NotificationCompat.PRIORITY_MAX)

一共有五个常量选择:PRIORITY_MIN,PRIORITY_LOW,PRIORITY_DEFAULT,PRIORITY_HIGH,PRIORITY_MAX。
每个常量代表了通知的重要程度。最高重要程度的通知必须马上要让用户看到,甚至需要用户立即作出反应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值