《第一行代码》笔记(1)——通知

本文深入讲解Android系统中通知的创建、展示及高级功能,包括如何使用NotificationManager和NotificationCompat.Builder,以及如何设置通知的样式、优先级和行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.zjw.mymultimedia;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.NotificationCompat;
import android.view.View;
import android.widget.Button;

//8.2 p283 使用通知
/*
当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,可以借助通知来实现
发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容
 */

//8.2.1 p283 通知的基本用法
/*
需要一个NotificationManager来管理通知
调用Context的getSystemService()来获得管理器
getSystemService()方法接收一个字符串参数用于确定获取的是系统的哪个服务
这里传入Context.NOTIFICATION_SERVICE
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 */
/*
接下来需要一个Builder构造器来创建Notification对象
由于android系统的每一个版本都会对通知这部分内容进行修改,API不稳定性问题在通知上尤其严重
所以要用support库中提供的兼容API
support-v4库中提供了一个NotificationCompat类
使用这个类的构造器来创建Notification对象
Notification notification =
new NotificationCompat.Builder(BaseUseOfNotification.this).build();
可以在build之前连缀多个设置方法
    Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                .setContentTitle("This is content title")
                .setContentText("This is content text")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.icecream_01)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icecream_02))
                .build();
 */
/*
以上完成后,只需要调用NotificationManager的notify()方法就可以让通知显示出来
notify()方法接收两个参数
第一个参数:id,要保证为每一个通知所指定的id都是不同
第二个参数:Notification对象
可以写成:manager.notify(1,notificaton)
 */

//布局里写一个发送通知按钮

/*
要实现通知的点击效果,要用PendingIntent
PendingIntent与Intent比较:
共同点:都可指明某一个意图,都可启动活动,启动服务以及发送广播等
不通点:  Intent更倾向于去立即执行某个动作
        PendingIntent更倾向于在某个合适的时机去执行某个动作
也可以把PendingIntent理解为延迟执行的Intent
 */
/*
PendingIntent主要提供了几个静态方法用于获取PendingIntent的实例
可以根据需要使用getActivity(),getBroadcast(),getService()方法
接收四个参数:
第一个参数:Context
第二个参数:一般用不到,通常传入0即可
第三个参数:Intent对象,可以通过这个对象构建出PendingIntent的"意图"
第四个参数:用于确定PendingIntent的行为,有FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT四种值可选,通常传入0即可
 */
/*
NotificationCompat.Builder这个构造器还可以再连缀一个setContentIntent()方法,接受的参数正是一个PendingIntent对象
 */
//新建一个用来跳转的活动NotificationActivity,布局一个TextView

/*
要实现点击通知跳转后通知消失的效果
(如果我们没有在代码中对该通知进行取消,它就会一直显示在系统的状态栏上)
方案一:在NotificationCompat.Builder中再连缀一个setAutoCancel()方法,参数传入true,点击通知自动消失
     Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        .setContentTitle("This is content title")
                        .setContentText("This is content text")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.icecream_01)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icecream_02))
                        .setContentIntent(pi)
                        .setAutoCancel(true)
                        .build();
方案二:显示地调用NotificationManager的cancel()方法将它取消(写在跳转后的类中),传入的参数是通知的id,前面notificationManager.notify(1,notification);的时候传入的
     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.cancel(1);
 */

//8.2.2 p289 通知的进阶技巧
/*
NotificationCompat.Builder提供了丰富的API
setSound(),可以在通知发出时播放一段音频,参数:Uri参数
每个手机的/system/media.audio/ringtones目录下都有很多的音频文件
例:
                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setSound(Uri.fromFile(new File("/system/media.audio/ringtones/Luna.ogg")))
                        .build();
 */
/*
还可以再通知到来的时候让手机进行震动,使用vibrate属性
vibrate是一个长整型数组,用于设置手机静止和震动的时长,以毫秒为单位
下标为0的值表示手机静止的时长,下标为1的值表示手机震动的时长,下标为2的值又表示手机静止的时长,以此类推
如果想要手机在通知到来的时候立刻震动1秒,再静止1秒,再震动1 秒,代码可以写成
                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setVibrate(new long[]{0,1000,1000,1000})
                        .build();
 需要声明权限:<uses-permission android:name="android.permission.VIBRATE"/>(我自己真机测试没申明权限也能震动??)
 */
/*
当有通知,且手机处于锁屏状态,控制手机前置Led灯闪烁,使用setLights()方法,接收三个参数
参数一:用于指定Led灯的颜色
参数二:用于指定Led灯亮起的时长,以毫秒为单位
参数三:用于指定Led灯暗去的时长,以毫秒为单位
如果想要实现Led灯以绿色的灯光一闪一闪的效果,可以写成(有别的灯可能会被覆盖掉,比如充电状态):
                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setLights(Color.GREEN,1000,1000)
                        .build();
如果不想自己设置铃声震动,可以直接使用通知的默认效果,代码如下
                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setDefaults(NotificationCompat.DEFAULT_ALL)
                        .build();
 */

//8.2.3 p291 通知的高级功能
/*
继续API
setStyle(),允许我们构建出富文本的通知内容,接受一个NotificationCompat.Style参数,该参数用来构建富文本信息,如长文字,图片
如果不使用该方法,而直接在setContentText()中设置长文字,将无法显示完整,多余部分会用省略号代替
使用NotificationCompat.BigtextStyle封装长文字信息,用bigText()传入参数
代码如下
                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to" +
                                "buile notifications,send and sync data, and use voice actions." +
                                "Get the official Android IDE and developer tools to build apps for Android"))
                        .build();
 */
/*
除了显示长文字外,通知里还可以还可以显示一张大图片
代码如下
 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.c)))
                        .build();
 */
/*
setPriority()设置通知的重要程度,接收一个整型参数,一共5个常量值可选:
PRIORITY_DEFAULT表示默认的重要程度,和不设置效果是一样的
PRIORITY_MIN表示最低的重要程度,系统可能只会在特定的场景才会显示这条通知,比如用户下拉状态栏的时候
PRIORITY_LOW表示较低的重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排列在更重要的通知之后
PRIORITY_HIGH表示较高的重要程度,系统可能将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置
PRIORITY_MAX表示最高的重要程度,需要用户立刻看到,通知不再是系统状态栏显示的一个小图标,而是弹出一个横幅,并附带了通知的详细内容(需要在通知设置里面允许横幅)
代码如下
                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        ...
                        .setPriority(NotificationCompat.PRIORITY_MAX)
                        .build();
 */
public class BaseUseOfNotification extends AppCompatActivity {

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

        Button button= (Button) findViewById(R.id.btn_send_notice);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(BaseUseOfNotification.this,NotificationActivity.class);
                PendingIntent pi=PendingIntent.getActivity(BaseUseOfNotification.this,0,intent,0);

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

                Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this)
                        .setContentTitle("This is content title")
                        .setContentText("This is content text")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.icecream_01)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icecream_02))
                        .setContentIntent(pi)
//                        .setAutoCancel(true)
//                        .setSound(Uri.fromFile(new File("/system/media.audio/ringtones/Luna.ogg")))
//                        .setVibrate(new long[]{0,1000,1000,1000})
//                        .setLights(Color.GREEN,1000,1000)
//                        .setDefaults(NotificationCompat.DEFAULT_ALL)
//                        .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to" +
//                                "buile notifications,send and sync data, and use voice actions." +
//                                "Get the official Android IDE and developer tools to build apps for Android"))
//                        .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.c)))
                        .setPriority(NotificationCompat.PRIORITY_MAX)
                        .build();

                notificationManager.notify(1,notification);
            }
        });
    }
}

转载于:https://my.oschina.net/u/3620480/blog/1476873

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值