第一行代码学习——通知

基础知识 

Tip1:通知可以在活动里创建,可以在广播接收器里面创建,也可以在服务里面创建,而相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入后台的时候我们才需要通知。

首先熟悉一下通知的创建步骤:

1、由于我们需要一个NotificationManager来管理通知,调用Context的getSystemService()方法来获取到。

NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

 2、使用一个Builder构造器创建Notification对象。【在这里要注意一个问题:API不稳定。解决方案就是用support库中提供了一个NotificationCompat类,使用这个类的构造器Builder来创建Notification对象,就可以保证在所有的Android版本上都能够正常的工作了】

Notification notification = new NotificationCompat.Builder(context).build();

3、连缀任意多的设置方法来创建一个丰富的Notification对象。基础设置如下:

Notification notification = new NotificationCompat.Builder(Context)
        .setContentTitle("This is content title")
        .setContentText("This is content text")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.drawable.small.icon)
       .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon))
        .build();
  • setContentTitle:指定通知的标题内容,下拉系统状态栏可以直观看到这部分内容。
  • setContentText:指定通知的正文内容,下拉系统状态栏可以直观看到这部分内容。
  • setWhen:指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。
  • setSmallIcon:设置通知的小图标,只能使用纯alpha图层的图片进行设置,会显示在系统状态栏上。
  • setLargeIcon:设置通知的大图标,当下拉系统状态栏时就可以看到设置的大图标了。

4、设置完成之后,我们就要将其显示出来。在这里我们只需要调用NotificationManager的notify()方法就可以让通知显示出来了。

manager.notify(1,notification);
    public void notify(int id, Notification notification)
    {
        notify(null, id, notification);
    }

通过查看notify源码,了解notify()方法接收两个参数。第一个参数是id,要保证每个通知所指定的id都不同;第二个参数是Notification对象,我们直接将自己创建好的Notification对象传入即可。

但是此时的通知点击是没有任何效果的,我们经常使用的大家都知道,我们在平常使用手机过程中,点击通知可以直接跳转到应用程序的Activity,那么在这里我们也设置一下。在设置跳转时,就需要我们了解一下PendingIntent。

PendingIntent,听名字就和Intent有些类似,作用也有些相似。比如它们都可以去指明某一个“意图”,都可以用来启动活动、启动服务以及发送广播等。不同的是,Intent更倾向于去立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作【可以把PendingIntent理解为一个延迟执行的Intent】。

PendingIntent的用法:它主要提供了几个静态方法用于获取PendingIntent实例,根据需求选择使用getActivity()方法、getService()方法,还是getBroadcast()方法。不过这几个方法所接收的参数都是相同的。

    public static PendingIntent getActivity(Context context, int requestCode,
            Intent intent, @Flags int flags) {
        return getActivity(context, requestCode, intent, flags, null);
    }

         第一个参数依旧是Context;

         第二个参数我们一般都传入0;

          第三个参数是一个Intent对象,通过这个对象可以构建出PendingIntent的“意图”;

          第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANAEL_CURRENT、FLAG_UPDATE_CURRENT,通常情况下传入0即可。

在这里我们只需要将Intent对象传入PendingIntent对象中,添加到设置中即可。如下:

 Intent intent = new Intent(this,NotificationActivity.class);
                PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(this)
                        .setContentTitle("This is content title")
                        .setContentText("This is content text")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                        .setContentIntent(pi)
                        .build();

 这样子就完成了对通知点击事件的设置。

但是当我们点击进入跳转页面后,发现了一个问题:通知图标并没有消息。这个和我们平常的认知并不一样,当我们点击进入该活动后,状态栏中的通知应该消失了呀,那么接下来我们就针对这个问题设置一下。

第一个方法:在NotificationCompat.Builder中再连缀一个setAutoCancel()方法。

                        .setContentIntent(pi)
                        .setAutoCancel(true)
                        .build();

第二种方法:显式地调用NotificationManager的canael()方法将它取消。

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        send_notice = (Button) findViewById(R.id.send_inform);
        send_notice.setOnClickListener(this);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(1);

当时给通知设置指定的id为1,此处指明删除id为1的通知。

进阶技巧 

Tip2:上面我们学习了通知的一些基础知识,接下来我们介绍一些API来创建出更加多样的通知效果。

1、【设置音频】setSound()方法:接收一个Uri参数,所以在指定音频文件时还需要先获取到音频文件对应的URI。

                        .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Lina.ogg")))
                        .build();

2、【设置震动】setVibrate()方法:长整型的数组,用于设置手机静止和震动的时长,以毫秒为单位。【下标为0的值表示手机静止的时长,下标为1的值表示手机震动的时长,以此类推....】

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

不过,想要控制手机振动还需要生命权限,因此我们需要在AndroidManifest.xml文件中加入如下声明:

    

3、【设置闪光灯】setLights()方法:第一个参数用于指定LED灯的颜色;第二个参数用于指定LED灯亮起的时长;第三个参数用于指定LED暗去的时长,也是以毫秒为单位的。

                        .setLights(Color.GREEN,1000,1000)
                        .build();

如果想使用通知的默认效果,可以按照如下写法:

                        .setDefaults(NotificationCompat.DEFAULT_ALL)
                        .build();

高级功能

Tip3:上面学习了一些简单的API用法,接下来我们学习更加强大的API的用法,构建出更加丰富的通知效果。

1、setStyle()方法:允许构建出富文本的通知内容。接收一个NotificationCompat.Style参数,用来构建具体的富文本信息的。

(1)设置富文本:

                    .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to build notifications,send and sync data,and use voice actions.Get the official Android IDE and developer tools to build apps for Android."))

(2)设置大图片:

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

2、setPriority()方法:设置通知的重要程度,接收一个整形参数用于设置这条通知的重要程度。

PRIORITY_DEFAULT:默认的重要程度,和不设置相同效果。

PRIORITY_MIN:最低的重要程度,只会在特定的场景才会显示这条通知。比如用户下拉状态栏时。

PRIORITY_LOW:较低的重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排在更重要的通知之后。

PRIORITY_HIGH:较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置。

PRIORITY_MAX:最高的重要程度,这类通知消息必须要让用户立即看到,甚至需要用户做出响应操作。

                        .setPriority(NotificationCompat.PRIORITY_MAX)

 

你可能感兴趣的:(Android基础)