360衛士通知盒子和紅包助手的實現原理(NotificationListenerService)
Google在Android 4.3 (API 18)中引入一個新類NotificationListenerService,它的功能很強大,當任何應用彈出通知的時候,它都可以接收到,並且當通知被移除的時候,它也可以接收到資訊,很顯然,我們可以通過這個類來對手機中的通知進行管理,360通知盒子和紅包助手就是這樣實現的,紅包助手主要就是通過得到通知欄的通知來檢視是否為紅包的提示通知,如果是就提示紅包來了。
現在大致說說用法吧!
1、建立一個類繼承NotificationListenerService,實現它兩個非常重要的方法onNotificationPosted和onNotificationRemoved,一個是當有通知到來的時候的回撥,一個是通知被移除的時候的回撥。
public class NLService extends NotificationListenerService {
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
}
}
當有通知到來的時候,onNotificationPosted就會呼叫,引數StatusBarNotification為狀態列通知的具體資訊。
當狀態列通知被移除的時候,onNotificationRemoved就會呼叫,引數StatusBarNotification為狀態列通知的具體資訊。
2、在AndroidManifest檔案中安裝下面宣告這個Service
<service android:name="com.example.notificationservice.NLService"
android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
需要注意的是,必須帶有BIND_NOTIFICATION_LISTENER_SERVICE許可權和一個action為NotificationListenerService的Intent filter。
這樣我們就基本可以實現通知的管理了,具體的通知管理自己可以根據需要去實現。
3、執行程式之後,進行許可權開啟
當我們執行程式之後,在“設定”-> “安全” -> “通知讀取許可權” 就會出現我們程式對應的通知讀取開關,預設是關閉的,所以我們需要進行開啟。
我們也可以使用程式碼檢查該許可權是否開啟:
boolean isOpenNotificationReadPermission() {
String notiStr = Settings.Secure.getString(getContentResolver(),
"enabled_notification_listeners");
if (notiStr != null && !TextUtils.isEmpty(notiStr)) {
final String[] names = notiStr.split(":");
for (int i = 0; i < names.length; i++) {
ComponentName cn = ComponentName.unflattenFromString(names[i]);
if (cn != null) {
return getPackageName().equals(cn.getPackageName());
}
}
}
return false;
}
程式碼進入“通知讀取許可權”介面
if (!isOpenNotificationReadPermission()) {
Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
cxt.startActivity(intent);
}
4、下面我們來說說NotificationListenerService和StatusBarNotification裡面有哪些有用的方法。
刪除系統中可被清除的通知;
final void cancelAllNotifications()
final void cancelNotification(String pkg, String tag, int id)
final void cancelNotification(String key)
final void cancelNotifications(String[] keys)
得到當前通知欄顯示的通知
StatusBarNotification[] getActiveNotifications()
StatusBarNotification[] getActiveNotifications(String[] keys)
開始監聽回撥
onListenerConnected()
通知出現回撥
onNotificationPosted(StatusBarNotification sbn, NotificationListenerService.RankingMap rankingMap)
onNotificationPosted(StatusBarNotification sbn)
通知移除回撥
onNotificationRemoved(StatusBarNotification sbn)
onNotificationRemoved(StatusBarNotification sbn, NotificationListenerService.RankingMap rankingMap)
告訴notification manager指定的通知必須被使用者看到
final void setNotificationsShown(String[] keys)
(2)StatusBarNotification
返回通知對應的id;
int getId()
返回通知物件;
Notification getNotification()
返回通知對應的包名;
String getPackageName()
返回通知發起的時間;
long getPostTime()
返回通知的Tag,如果沒有設定返回null;
String getTag()
boolean isClearable()
返回該通知是否可被清楚,FLAG_ONGOING_EVENT、FLAG_NO_CLEAR;
boolean isOngoing()
isOngoing():檢查該通知的flag是否為FLAG_ONGOING_EVENT;