Android入门(14)| 通知


创建通知

创建通知的步骤:

  1. 管理通知的 NotificationManager,通常通过当前 ContextgetSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。
  2. Android 8.0(O) 版本后需要通知通道(通知类别) Notificationchannel 以细致化管理通知。
  3. 使用 Builder构造器 来创建 Notification对象。可以使用 support库 提供的 NotificationCompat类 中的 Builder 来兼容不同 Android 版本。
  4. 通过 NotificationManager.notify() 显示通知,该方法有两个参数:
    1. 每个通知都不同的 id;
    2. Notification对象。

点击效果

此时点击该通知没有什么反应,这需要通过 PendingIntent 实现点击通知后的意图。它类似于 Intent ,可以启动活动、服务以及发送广播等,不同的是,Intent 更倾向于立即执行某动作,而 PendingIntent 倾向于在某个时机去执行某动作。换言之,PendingIntent 是延迟执行的 Intent。

PendingIntent 主要用到三个静态方法以获取实例,分别是 getActivity()getBroadcast()getService(),他们都有四个参数:

  1. Context
  2. int requestCode:请求代码,通常传入 0
  3. Intent 对象
  4. int flags:确定 PendingIntent 的行为,通常情况下传入 0,但也有四种具体值可选:FLAG_ONT_SHOTFLAG_CANCEL_CURRENTFLAG_NO_CREATEFLAG_UPDATE_CURRENT

PendingIntent对象 是通过 NotificationCompat.Builder.setContentIntent() 方法来在用户点击通知时执行意图的。

如何实现点击通知后,通知消失?

点击该通知后这条通知并不会消失,解决的方法有两种:

  1. NotificationCompat.Builder 中连缀一个 setAutoCancel() 方法,并传入参数 true
    在这里插入图片描述

  2. 显式地在点击通知后调转到的页面的 onCreate 阶段,通过 NotificationManager.cacel() 将他取消:
    在这里插入图片描述


其它小功能

NotificationCompat.Builder 提供了非常丰富的 API 供我们创建多样的通知效果,这里举例几个常用的:

setSound():设置通知铃声,在 Android 8.0(O) 版本后需要在通知管道中添加 AudioAttributes 音频属性,关于 AudioAttributes 详情见本博客。

在这里插入图片描述


setVibrate():设置手机震动,参数为长整型数组,以毫秒为单位,偶数下标代表手机静止时长,奇数下标代表手机震动时长。别忘了声明手机震动权限:

在这里插入图片描述

// 8.0 版本后需要在通知通道中设置允许震动
notificationChannel.enableVibration(true);
// 通知到来时立刻震动1秒,然后静止1秒,再震动1秒。
.setVibrate(new long[] {
    
    0, 1000, 1000, 1000})

setLights():设置呼吸灯,参数分别指定颜色亮起时长熄灭时长。时长都以毫秒为单位。

// 8.0 版本后需要在通知通道中设置允许启用呼吸灯
notificationChannel.enableLights(true);
.setLights(Color.CYAN, 1000, 1000)

setStyle():构建富文本内容,如长文件、图片等:

  1. 长文字: 如果在 setContentText() 中设置的文本较长,那么多余的部分会被省略号替代。

在这里插入图片描述
而通过 setStyle() 我们可以在下滑的通知栏中显示完整内容(通知弹窗中的多余内容仍会被省略号替代):

.setStyle(new NotificationCompat.BigTextStyle().bigText("联系人cmy向您发来一条消息哈哈哈哈哈哈哈哈哈哈哈哈哈哈"))

在这里插入图片描述

  1. 图片: 也可以在通知内容中加入图片:
// 图片,通过BitmapFactory.decodeResource()将图片解析成Bitmap对象
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource
	(getResources(), R.drawable.cmy1)))

在这里插入图片描述


setPriority():设置通知的重要程度

共有五个常量值可选:

  1. PRIORITY_DEFAULT: 默认,不特意设置时就是此值。
  2. PRIORITY_MIN: 最低的重要程度,系统只会在用户下拉状态栏等特定情况才会显示该通知。
  3. PRIORITY_LOW:较低的重要程度,系统会将该类通知缩小,显示顺序在 PRIORITY_HIGH 之后。
  4. PRIORITY_HIGH:较高的重要程度,系统会将这类通知放大,显示顺序在 PRIORITY_MAX 之后。
  5. PRIORITY_MAX:最高的重要程度,系统会让用户立刻看到该通知,甚至需要用户做出响应操作。

在 Android 8.0 版本后,通知的重要程度作为通知管道 NotificationChannel 构造函数的第三个参数存在,有以下值可选:

  1. NotificationManager.lMPORTANCE_UNSPECIFIED,
  2. NotificationManager.IMPORTANCE_NONE
  3. NotificationManager.IMPORTANCE_MIN
  4. NotificationManager.IMPORTANCE_LOW
  5. NotificationManager.IMPORTANCE_DEFAULT
  6. NotificationManager.IMPORTANCE_HIGH

在这里插入图片描述

PS: 如若上述设置未生效,则应卸载软件重新安装后重试,这是因为所有配置都是在第一次创建通道时生效的


实例

实现通过点击按钮发出通知:

布局文件 notice_layout.xml
在这里插入图片描述

活动文件:

public class NotificationActivity extends AppCompatActivity implements View.OnClickListener{
    
    
    private static final String TAG = "NotificationActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notice_layout);

        Button button_send = findViewById(R.id.button_sendNotice);
        button_send.setOnClickListener(this);
    }

    public void onClick(View v){
    
    
        switch (v.getId()){
    
    
            case R.id.button_sendNotice:
                // 通知音频的Uri
                Uri soundUri = Uri.parse("android.resource://"+getPackageName()+ "/"+R.raw.madara);
                Log.e(TAG, soundUri.toString());
                // 通知的id
                String id = "1";

                // 点击通知后的跳转意图
                Intent intent = new Intent(this, DialogActivity.class);
                PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);

                /* 通知的创建流程 */
                // 第一步,管理通知的Manager
                NotificationManager manager = (NotificationManager)
                        getSystemService(Context.NOTIFICATION_SERVICE);

                // 8.0(O)版本后需要通知通道(Notification channel)
                if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
    
    
                    String name = getString(R.string.app_name);
                    // 创建通知通道
                    // 第一个参数要和NotificationCompat.Builder的channelId一样
                    // 第三个参数是通知的重要程度
                    NotificationChannel notificationChannel = new NotificationChannel(id, name,
                            NotificationManager.IMPORTANCE_HIGH);
                    // 如果上面用IMPORTANCE_NONE就需要在系统的设置里面开启渠道,通知才能正常弹出

                    /* 通知管道中开启声音、呼吸灯、震动等功能 */
                    // 呼吸灯
                    //notificationChannel.setLightColor(Color.CYAN);
                    notificationChannel.enableLights(true);
                    // 声音
                    // 先创建音频属性
                    AudioAttributes audioAttributes = new AudioAttributes.Builder()
                            // 描述音频的内容类型,语音(speech)、音乐(music)、提示音(sonification)等
                            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                            // 使用场景,USAGE_NOTIFICATION表明用于通知
                            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                            .build();
                    // 通知管道加入音频
                    notificationChannel.setSound(soundUri, audioAttributes);
                    // 震动
                    notificationChannel.enableVibration(true);

                    // 设置是否应在锁定屏幕上显示此频道的通知
                    notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
                    // 绕过免打扰模式
                    notificationChannel.setBypassDnd(true);

                    // 将通知通道加入管理通知的NotificationManager
                    manager.createNotificationChannel(notificationChannel);
                }

                // 第二步,使用builder构造器来创建Notification对象
                // 通过support库提供的NotificationCompat来兼容不同版本
                Notification notification = new NotificationCompat.Builder(this, id)
                        .setContentTitle("消息通知")
                        .setContentText("联系人cmy向您发来一条消息")
                        // 长文本
                        /*.setStyle(new NotificationCompat.BigTextStyle().bigText("联系人cmy向您发来" +
                                "一条消息哈哈哈哈哈哈哈哈哈哈哈哈哈哈"))*/
                        // 图片,通过BitmapFactory.decodeResource()将图片解析成Bitmap对象
                        .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory
                            .decodeResource(getResources(), R.drawable.cmy1)))
                        // 指定通知被创建的时间,该时间会显示在通知上。
                        .setWhen(System.currentTimeMillis())
                        // 通知的小图标,显示在系统状态栏上只能用纯alpha图层的图片设置
                        .setSmallIcon(R.mipmap.ic_launcher)
                        // 大图标,下拉系统状态栏时可见
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.cmy1))
                        // 点击通知后执行的意图
                        .setContentIntent(pi)
                        // 点击通知后通知消失
                        // .setAutoCancel(true)
                        // 通知铃声
                        //.setSound(soundUri)
                        // 手机震动,通知到来时立刻震动1秒,然后静止1秒,再震动1秒
                        .setVibrate(new long[] {
    
    0, 1000, 1000, 1000})
                        // 呼吸灯,参数分别指定颜色、亮起时长、熄灭时长,时长都以毫秒为单位
                        .setLights(Color.CYAN, 1000, 1000)
                        // 根据当前手机环境来决定通知铃声、如何震动
                        //.setDefaults(NotificationCompat.DEFAULT_ALL)
                        // 构造通知
                        .build();
                // 第三步,显示通知;每个通知的id都不同,第二个参数是Notification对象
                manager.notify(2, notification);
                break;
            default:
                break;
        }
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述

点击通知后跳转:
在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/Jormungand_V/article/details/123261450