Android基础之Notification

本文介绍了Android通知的定义,它是具有全局效果、展示在屏幕顶端的通知。还详细阐述了其使用方法,包括不同版本创建通知的方式、简单使用步骤、更新与取消通知、通知类型、进度条、点击事件、浮动通知、锁屏通知、保留Activity返回栈及自定义通知等内容。

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

一、定义

是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。

二、使用

Android 3.0 (API level 11)之前,使用new Notification()方式创建通知。

Android 3.0开始弃用new Notification()方式,改用Notification.Builder()来创建通知。

为兼容API 11之前的版本,v4 Support Library中提供了NotificationCompat.Builder()这个替代方法。与Notification.Builder()类似,没有太大区别。

1、简单使用

<1> 创建NotificationManager和通知ID

private static final int DEFAULT_NOTIFICATION_ID = 1;
		
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

<2> 构建Notification对象

android8.0新增NotificationChannel,如果App的targetSDKVersion>=26,没有设置channel通知渠道的话,就会导致通知无法展示。
所以NotificationCompat.Builder builder = new NotificationCompat.Builder(this,null);在8.0上会报错

String channelID = "1";

String channelName = "channel_name";
		
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
		
     NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);

     mNotificationManager.createNotificationChannel(channel);
}eles{
     NotificationCompat.Builder builder = new NotificationCompat.Builder(this,null);
}
		
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,channelID)
		
builder.setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("Send Notification")
            .setContentText("Hi,My id is 1");
			
Notification notification = builder.build();

<3> 发送通知

mNotificationManager.notify(DEFAULT_NOTIFICATION_ID,notification);

一个通知必须包含以下三项属性:小图标(setSmallIcon())通知标题(setContentTitle())详细信息(setContentText())

Android O 引入了 通知渠道(Notification Channels),以提供统一的系统来帮助用户管理通知,如果是针对 android O 为目标平台时必须实现一个或者多个通知渠道,以向用户显示通知。比如聊天软件,为每个聊天组设置一个通知渠道,并可以指定特定声音、灯光等配置。

2、更新通知

在使用NotificationManager.notify()发送通知的时候,需要传递一个标识符(DEFAULT_NOTIFICATION_ID),用于唯一标识这个通知。如果想要更新这个通知的内容,那就只需要使用与之前通知相同标识符来发送通知,旧的通知就被被新的通知所取代。

3、取消通知

取消通知有如下4种方式:

<1> 点击通知栏的清除按钮,会清除所有可清除的通知
		
<2> 设置了 setAutoCancel() 或 FLAG_AUTO_CANCEL的通知,点击该通知时会清除它

<3> 通过 NotificationManager 调用 cancel() 方法清除指定ID的通知

<4> 通过 NotificationManager 调用 cancelAll() 方法清除所有该应用之前发送的通知

4、通知类型

通知有两种视图:普通视图和大视图。

默认情况下为普通视图,可通过NotificationCompat.Builder.setStyle()设置大视图。

对于大视图,Android提供了三个实现类,用于显示不同的场景。分别是:

NotificationCompat.BigPictureStyle, 在细节部分显示一个256dp高度的位图。

NotificationCompat.BigTextStyle,在细节部分显示一个大的文本块。

NotificationCompat.InboxStyle,在细节部分显示一段行文本。

BigTextStyle

builder.setStyle(new NotificationCompat.BigTextStyle()
         .bigText("这里是点击通知后要显示的正文,可以换行可以显示很长")
         .setBigContentTitle("点击后的标题")
         .setSummaryText("末尾只一行的文字内容")//SummaryText没什么用 可以不设置
)

BigPictureStyle

builder.setStyle(new NotificationCompat.BigPictureStyle()
          .setBigContentTitle("BigContentTitle")
          .setSummaryText("SummaryText")
          .bigPicture(BitmapFactory.decodeResource(getResources(), R.mipmap.test))
)

InboxStyle

builder.setStyle(new NotificationCompat.InboxStyle()
          .setBigContentTitle("BigContentTitle")
          .addLine("第一行,第一行,第一行,第一行,第一行,第一行,第一行")
          .addLine("第二行")
          .addLine("第三行")
          .addLine("第四行")
          .addLine("第五行")
          .setSummaryText("SummaryText")
)			

注: 大视图(Big Views)由Android 4.1(API level 16)开始引入,且仅支持Android 4.1及更高版本。

5、进度条

进度条也分两种进度明确和进度不明确

使用setProgress(max, progress, false)来更新进度。

    max: 最大进度值
	
    progress: 当前进度

    false: 是否是不明确的进度条		

一般设置使用setProgress(0, 0, true)来表示进度不明确的进度条

6、点击事件

创建 Notification 中发送的通知并不具备与用户交互的能力,这是因为没有给 Notification设置Action。通过绑定一个意图,当用户点击通知的时候,调用一个意图展示出一个Activity。

<1> 创建Intent和pendingIntent对象

Intent intent = new Intent(this, TestNotificationActivity.class);
	
PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

<2> 为Notification.Builder设置intent

builder.setContentIntent(pendingIntent);

获得适用于不同场景的PendingIntent对象:

FLAG_CANCEL_CURRENT:如果构建的PendingIntent已经存在,则取消前一个,重新构建一个。
		
FLAG_NO_CREATE:如果前一个PendingIntent已经不存在了,将不再构建它。
		
FLAG_ONE_SHOT:表明这里构建的PendingIntent只能使用一次。
		
FLAG_UPDATE_CURRENT:如果构建的PendingIntent已经存在,则替换它,常用。

除了通过点击通知跳转到Activity外,还可以设置按钮,进行跳转

builder.addAction(R.drawable.test,"跳转",pendingIntent)
7、浮动通知(Heads-up Notifications)

Android 5.0(API level 21)开始,当屏幕未上锁且亮屏时,通知可以以小窗口形式显示。用户可以在不离开当前应用前提下操作该通知。

builder.setFullScreenIntent(pendingIntent, false);

以下两种情况会显示浮动通知:

setFullScreenIntent(),如上述示例。

通知拥有高优先级(PRIORITY_MAX 或 PRIORITY_HIGH)且使用了铃声和振动

8、锁屏通知

Android 5.0(API level 21)开始,通知可以显示在锁屏上。用户可以通过设置选择是否允许敏感的通知内容显示在安全的锁屏上。

可以通过setVisibility()控制通知的显示等级:

<1> VISIBILITY_PRIVATE : 显示基本信息,如通知的图标,但隐藏通知的全部内容

<2> VISIBILITY_PUBLIC : 显示通知的全部内容

<3> VISIBILITY_SECRET : 不显示任何内容,包括图标
9、保留Activity返回栈

默认情况下,从通知启动一个Activity,按返回键会回到主屏幕。但某些时候有按返回键仍然留在当前应用的需求,这就要用到TaskStackBuilder了。

<1> 在manifest中定义Activity的关系

<activity
      android:name=".ResultActivity"
      android:parentActivityName=".MainActivity">
</activity>

<2> 构建带返回栈的PendingIntent并发送通知

Intent intent = new Intent(this, ResultActivity.class); 
		
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// 添加返回栈 
stackBuilder.addParentStack(ResultActivity.class); 
// 添加Intent到栈顶 
stackBuilder.addNextIntent(intent); 
// 创建包含返回栈的
pendingIntent PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
        
builder.setContentIntent(pendingIntent);

上述操作后,从通知启动ResultActivity,按返回键会回到MainActivity,而不是主屏幕。
10、自定义通知(RemoteViews)

和Toast一样,通知也可以使用自定义的XML来自定义样式,但是对于通知而言,因为它的全局性,并不能简单的通过inflate出一个View,因为可能触发通知的时候,响应的App已经关闭,无法获取当指定的XML布局文件。所以需要使用单独的一个RemoteViews类来操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值