Android 11 的 Notification 点击和长按事件 ,Android11的源码流程
时间: 2024-05-31 22:15:05 浏览: 156
在 Android 11 中,Notification 点击和长按事件的处理流程如下:
1. 当用户点击或长按 Notification 时,系统会发送一个意图(Intent),用于启动 Notification 的目标 Activity。
2. 如果 Notification 中设置了 PendingIntent,则系统会使用 PendingIntent 中的 Intent 启动目标 Activity;否则,系统会创建一个新的 Intent,将 Notification 对应的数据添加到 Intent 中,并启动目标 Activity。
3. 在启动目标 Activity 之前,系统会检查应用程序的权限,确保用户已经授权该应用程序访问 Notification 数据。
4. 如果权限被授予,则系统将启动目标 Activity,并将 Notification 数据传递给该 Activity。目标 Activity 可以使用 NotificationManagerCompat 类中的方法来获取 Notification 数据。
5. 如果权限未被授予,则系统不会启动目标 Activity,而是显示一个通知,请求用户授权该应用程序访问 Notification 数据。
总的来说,Android 11 在处理 Notification 点击和长按事件时,会进行权限检查,并保证用户的隐私安全。同时,系统也提供了方便的 API,使应用程序可以轻松地获取 Notification 数据。
相关问题
Android 11 的 Notification 点击和长按事件,源码
Android 11 的 Notification 点击和长按事件的源码可以在 Android 开源项目中找到。具体来说,可以参考以下文件:
1. NotificationManagerService.java:这个文件包含了 NotificationManagerService 类,它是 Android 系统中负责管理通知的核心服务之一。在这个文件中,定义了一些与通知相关的常量、枚举类型和内部类,其中包括 NotificationRecord 类。
2. NotificationRecord.java:这个文件定义了 NotificationRecord 类,它表示一个通知。在这个类中,定义了一些成员变量,包括 PendingIntent 类型的 mClickIntent 和 mLongClickIntent,分别表示通知的点击和长按事件。
3. PendingIntent.java:这个文件定义了 PendingIntent 类,它表示一个待执行的操作。在 Android 中,可以使用 PendingIntent 来表示一个 Intent,当这个 PendingIntent 被触发时,系统会自动执行对应的 Intent。
通过分析这些文件,我们可以了解 Android 11 中通知点击和长按事件的实现原理。具体来说,当用户点击或长按某个通知时,系统会从 NotificationManagerService 中获取对应的 NotificationRecord 对象,然后从中获取 mClickIntent 或 mLongClickIntent 成员变量,并使用 PendingIntent 触发对应的操作。如果这些成员变量为 null,则不响应点击或长按事件。
Android11 中 Notification的长按是如何判断是长按的,源码
在 Android 11 中,当用户长按通知时,会触发 `NotificationLongPressHandler` 这个类的相关方法。
具体来说,当用户长按通知时,系统会通过 `NotificationPanelViewController` 的 `onNotificationLongPress` 方法接收到触摸事件,并将事件传递给 `NotificationEntryManager` 的 `onNotificationLongPress` 方法处理。在 `onNotificationLongPress` 方法中,系统会调用 `NotificationLongPressHandler` 的 `onNotificationLongPress` 方法,最终实现对长按通知的处理。
以下是 `NotificationLongPressHandler` 类的相关代码:
```java
public class NotificationLongPressHandler {
public boolean onNotificationLongPress(StatusBarNotification sbn, NotificationEntry entry,
NotificationMenuRowPlugin provider, ExpansionCallback expansionCallback,
boolean force) {
// 判断是否为长按事件
if (force || isLongPress(entry)) {
// 长按事件处理逻辑
...
return true;
}
return false;
}
private boolean isLongPress(NotificationEntry entry) {
// 判断是否为长按事件
...
return true;
}
}
```
在 `onNotificationLongPress` 方法中,首先会调用 `isLongPress` 方法判断是否为长按事件。`isLongPress` 方法的具体实现可以在 `NotificationGestureHelper` 类中找到,这里不再展开。
需要注意的是,以上代码仅为 Android 11 层面的实现,底层的实现可能会有所不同,具体可以查看 Android 11 源码。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)