Andorid初学之十九:通知

一、使用通知

通知( Notification)是Android系统中比较有特色的一个功能 ,当某个应用程序希望向用户发出些提示信息, 而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏中会显示一个通 知的图标,下拉状态栏后可以看到通知的详细内容。Andrid内通知功能获得了大量用户的认可和喜爱,就连ios系统也在5.0版本之后加入了类似的功能。

二、通知的基本用法

了解了通知的基本概念,下面我们就来看一下通知的使用方法吧。通知的用法还是比较灵活的,既可以在活动里创建,也可以在广播接收器里创建,当然还可以在下一章中 我们即将学习的服务里创建。相比于广播接收器和服务,在活动里创建通知的场最还是比较少的,因为一般只有
当程序进人到后台的时候我们才需要使用通知。不过,无论是在哪里创建通知,整体的步骤都是相同的,下面我们就来学习下 创建通 知的
详细步骤。
1、首先需要个NotificationManager 来对通知进行管理,可以调用Context 的getSystemService()方法获取到。getSystemService()方法接收一 个字符串参数用于确定获取系统的哪个服务,这里我们传人Context. NOTIFICATION_SERVICE 即可。因此,获取NotificationManager
的实例就可以写成:

NotificationManager manager = (NotificationManager)
getSystemService(Context.NOTIFICATION SERVICE);

2、接下来需要使用一个Builder构造器来创建Notification对象,但问题在于,几乎Android系统的每一个 版本都会对通知这部分功能进行或多或少的修改,API 不稳定性问题在通知上面突显得尤其严重。那么该如何解决这个问题呢?其实解决方案我们之前已经见过好几回了,就是使用support库中提供的兼容API。support-v4库中提供了一个NotificationCompat类,使用这个类的构造器来创建Notification对象,就可以保证我们的程序在所有Android 系统版本上都能正常工作了,代码如下所示:

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

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

Notification对象,先来看一些最基本的设置:
Notification notification = new NotificationCompat . Builder(context)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.smallicon)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),
R.drawable.large icon)).build();

上述代码中共调用了5个设置方法,下面我们来一一解析下。
setContentTitle()方法用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。setContentText()方法用于指定通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。setWhen()方法用于指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。setlSmallIcon()方法用于设置通知的小图标,注意只能使用纯alpha图层的图片进行设置,小图标会显示在系统状态栏上setLatgerIcon()方法用于设管通知的大图标,当下拉系统状态栏时,就可以看到设置的大图标了。

3、以上工作都完成之后,只需要调用NotifationManager的notify()方法就可以让通知显示出来了。notify()方法接收两个参数,第一个参数是id,要保证为每个通知所指定的id都是不同的。第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以写成:

manager. notify(1, notification);

A、到这里就已经把创建通知的每个步骤都分析完 了,下面就让我们通过一个 具体的例子来看看通知到底是长什么样的。
新建一个NifcationTest项目,并修改activity_main.xml中的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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/send_notice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send notice"
        android:textAllCaps="false"/>

</LinearLayout>

B、修改代码:

package com.example.notificationtest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.Notification;
import android.app.NotificationManager;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button sendNotice = findViewById(R.id.send_notice);
        sendNotice.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.send_notice:
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(this)
                        .setContentTitle("通知标题")
                        .setContentText("通知内容")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                        .build();
                manager.notify(1,notification);
                break;
            default:
                break;



        }

    }

}

4、实现通知的点击效果:PendingIntent
PendingIntent从名字上看起来就和Intent有些类似,它们之间也确实存在着不少共同点。比
如它们都可以去指明某一个“意图”, 都可以用于启动活动、启动服务以及发送广播等。不同的
是,Intent 更加倾向于去立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作。所以,也可以把PendingIntent简单地理解为延迟执行的Intent。PendingIntent的用法同样很简单,它主要提供了几个静态方法用于获取PendingIntent的实例,
可以根据需求来选择是使用getActivity()方法、getBroadcast()方法,还是getService()方法。这几个方法所接收的参数都是相同的,

第一个参数依旧是Context,不用多做解释。 第二个参数一般用不到,通常都是传人0即可。
第三个参数是个Intet对象,我们可以通过这个对象构建出Pndinglntent 的“意图”。
第四个参数用于确定Peininten的行为,有FLAG ONE_SHOT、FLAG_NO_CREATE、FLAG
_CANCEL_CURRENT 和FLAG_LUPDATE_CURRENT这4种值可选,每种值的具体含义你可以查看文档,通常情况下这个参数传入0就可以了。

对PendingIntent 有了一定的了解后,我们再回过头来看一下NotificationCompat.
Builder。这个构造器还可以再连缀一个setContentIntent()方法,接收的参数正是一个
PendingIntent对象。因此,这里就可以通过PendingIntent构建出一个延迟执行的“意图”, 当
用户点击这条通知时就会执行相应的逻辑。
现在我们来优化一下NotificationTest 项目,给刚才的通知加上点击功能,让用户点击它的时
候可以启动另一个活动。
A、首先需要准备好另一个活动, 右击com example notificationtest包→New Activity -Empty
Acivity,新建NoifiationActivity,布局起名为nffcation layou。然后修改nfifcation layout.xml
中的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".NotificationActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="THIS IS NOTIFICATION LAYOUT"/>

</RelativeLayout>

B、修改MainActivity代码,给通知加入点击功能:

package com.example.notificationtest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button sendNotice = findViewById(R.id.send_notice);
        sendNotice.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.send_notice:
                //(1)、先使用Intent表达出我们想要启动NotificationActivity的“意图”
                Intent intent = new Intent(this,NotificationActivity.class);
                //(2)、然后将构建好的Intent对象传入到PendingIntent的getActivity()方法里,以得到PendingIntent的实例
                PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(this)
                        .setContentTitle("通知标题")
                        .setContentText("通知内容")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                        //(3)、接着在NotificationActivityCompat.Builder中调用setContentIntent()方法,把它作为参数传入即可
                        .setContentIntent(pi)
                        .build();
                manager.notify(1,notification);
                break;
            default:
                break;



        }

    }

}

C、接着你就会发现,跳转过后通知依然还在通知栏上,这个时候就需要我们对它进行取消,有两种办法解决,一种是在NotificationCompat.Buider中再连缀一个setAutoCancel()方法,一种是显示地调用NotificationManager()的cancel()方法将它取消。
第一种:setAutoCancel()方法传入true就表示当点击了这个通知的时候,通知会自动取消
在这里插入图片描述
第二种方法:在cacel()方法传入了1,这个1是我们创建通知的时候给通知指定的id,如果你想取消哪条通知,在cancel()方法传入该通知id就行了
在这里插入图片描述

三、通知的进阶技巧

A、提示音频。NotificationCompat.Builder中提供了非常丰富的API来让我们创建出更加多样的通知效果,我们选些比较常用的
API来进行学习。先来看看setSound()方法,它可以在通知发出的时候播放一段音频,
这样就能够更好地告知用户有通知到来。setSound()方法接收一个Uri参数,所以在指定音频文件的时候还需要先获取到音频文件对应的URI.比如说,每个手机的/system/
media/audio/ringtones目录下都有很多的音频文件,我们可以从中随便选一个 音频文件,那么在代码中就可以这样指定:

Notification notification = new NotificationCompat .Builder(this)
...
.setSound(Uri. fromFile(new File("/system/ media/audio/ringtones/Luna.ogg"))).build() ;

B、提示振动。除了允许播放音频外,我们还可以在通知到来的时候让手机进行振动,使用的是vibrate这个属性。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长,下标为2的值又表示手机静止的时长,以此类推。所以,如果想要让手机在通讯到来的时候立刻振动1秒,然后静止1秒,再振动1秒,代码就可以写成:

Notification notification = new NotificationCompat.Builder(this)
...
.setVibrate(new long[]{0,1000,1000,1000})
.build();

不过想要控制手机振动还需要声明权限,因此还得编辑清单文件

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

C、学会控制如何在通知到来时控制手机LED灯的显示。
现在的手机基本上都会前置一个LED灯,当有未接电话或未读短信,而此时手机又处于锁屏状态时,LED灯就会不停地闪烁,提醒用户去看。我们可以使用setLights()方法来实现这种效果,setLights()方法接收3个参数,第一个参数用于指定LED灯的颜色,第二个参数用于指定LED灯亮起的时长,以毫秒为单位,第三个参数用于指定LED灯暗去的时长,也就以毫秒为单位。所以,当通知到来时,如果想要实现LED灯以绿色的灯光一闪一闪的效果,就可以写成:

Notification notification = new NotificationCompat.Builder(this)
...
.setLights(Color.GREEN,1000,1000);
.build();

如果你不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前的手机环境来决定播放什么玲声,以及如何振动:

Notification notification = new NotificationCompat.Builder(this)
...
.setDefaults(NotificationCompat.DEFAULT_ALL)
.build();

四、通知的高级功能

继续观察NotificationCompat.Builder这个类,现在学习它更强大的API用法,从而构建更加丰富的通知效果。
1、setStyle()方法,这个方法允许我们构建出富文本的通知内容,也就是说通知中不光可以有文字和图标,还可以包含更多的东西,setStyle()方法接收一个NotificationCompat.Style参数,这个参数就是用来构建具体的富文本信息的,如长文字、图片等;
例子:如果需要在通知内容中显示一段长文字的话,Android也是支持的,通过setStyle()方法就可以做到,具体写法如下:

Notification notification = new NotificationCompat.Builder(this)
...
.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 buid apps for Android."))
.build();

我们在setStyle()方法中创建了一个NotificationCompat.BigTextStyle对象,这个对象就是用于封装长文字信息的,我们调用它的bigText()方法将文字内容传入就可以了。
2、通知显示一张图片

Notification notification = new NotificationCompat.Builder(this)
...
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big_image)))
.build();

可以看到,这里仍然是调用的setStyle()方法,这次我们在参数中创建了一个NotificationCompat.BigPictureStyle()对象,这个对象就是用于设置大图片的,然后调用它的bigPicture()方法将图片传入。通过BitmapFactory的decodeResource()方法将图片解析成Bitmap对象,再传入到bigPicture()方法中就可以了。

3、setPriorty()方法,它可以用于设置通知的重要程度。setPriorty()方法接收一个整型参数用于设置这条通知的重要程度,一个有5个常量值可以选:PRIORITY_DEFAULT表示默认的重要程度,和不设置效果是一样的;PRIORITY_MIN表示最低的重要程度,系统可能只会在特定的场景才显示这条通知,比如用户下拉状态栏的时候,将其排在更重要的通知之后;PRIORITY_HIGH表示较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置;PRIORITY_MAX表示最高的重要程度,这类通知消息必须要让用户立刻看到,甚至需要用户做出响应操作。

Notification notification = new NotificationCompat.Builder(this)
...
.setPriority(NotificationCompat.PRIORITY_MAX)
.build();

这里我们将通知的重要程度设置成了最高,表示这是一条非常重要的通知,要求用户必须立刻看到,直接弹出一个横幅。

根据郭霖大神第一行代码学习,敬礼!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值