版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17376859.html
前言
INotificationManager是一个系统服务接口,它提供了访问和管理 Android 系统中通知相关功能的方法。使用INotificationManager需要架framework包,另外应用需要系统签名。
另外,你可能会被NotificationManager 与 NotificationManagerCompat 误导。其实这2个是在应用开发中使用的通知管理服务,它们只支持当前开发应用的通知创建、通知权限查询、通知取消。 它们与INotificationManager有本质的区别。
而INotificationManager的实现类是NotificationManagerService(路径:frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java)。 利用INotificationManager可以在系统开发中控制设备全局的应用的通知显示开关状态、通知创建、全部通知查询、通知取消。
在Android10原生设置中INotificationManager的代码使用位置
在具体了解INotificationManager的全部功能前,我们还是需要了解一下原生设置中INotificationManager的使用位置。我这里拿出来举例的是mtkSettings项目(联发科的Android原生设置),其他原生设置可能会有些细微不同。
首先在com.android.settings.notification目录下,是设置处理通知相关类的全部目录。
在NotificationSettingsBase这个类是管理通知设置的基本类,包含了一些通知设置的基本方法。而它实例并且持有了关键的NotificationBackend,如下图片:
而NotificationBackend持有了INotificationManager,图片如下:
开启关闭指定应用的通知
import android.app.INotificationManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.os.ServiceManager;
public class NotificationManagerUtil {
/**
* 设置通知启用状态
* @param context
* @param pkg
* @param enabled
*/
public static void setNotificationsEnabledForPackage(Context context, String pkg, boolean enabled) {
try {
getNotificationManager().setNotificationsEnabledForPackage(pkg, getUidForPackage(pkg, context), enabled);
} catch (RemoteException e) {
e.printStackTrace();
}
}
/**
* 获取uid
* @param packageName
* @param context
* @return
*/
public static int getUidForPackage(String packageName, Context context) {
PackageManager pm = context.getPackageManager();
try {
ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
return appInfo.uid;
} catch (PackageManager.NameNotFoundException e) {
// 应用程序未安装
return -1;
}
}
private static INotificationManager getNotificationManager(){
INotificationManager iNotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
return iNotificationManager;
}
}
查询通知的启用状态
import android.app.INotificationManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.os.ServiceManager;
public class NotificationManagerUtil {
/**
* 查询指定应用通知是否启用(注意!此方法查询结果存疑)
*/
public static boolean areNotificationsEnabled(String pkg){
try {
return getNotificationManager().areNotificationsEnabled(pkg);
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
/**
* 查询指定应用通知是否启用
*/
public static boolean areNotificationsEnabledForPackage(Context context, String pkg){
try {
return getNotificationManager().areNotificationsEnabledForPackage(pkg, getUidForPackage(pkg, context));
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
/**
* 获取uid
* @param packageName
* @param context
* @return
*/
public static int getUidForPackage(String packageName, Context context) {
PackageManager pm = context.getPackageManager();
try {
ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
return appInfo.uid;
} catch (PackageManager.NameNotFoundException e) {
// 应用程序未安装
return -1;
}
}
private static INotificationManager getNotificationManager(){
INotificationManager iNotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
return iNotificationManager;
}
}
获取通知级别
/**
* 获取指定apk的通知级别,不同的级别可以让通知的打扰程度不同
*/
public static void getPackageImportance(){
try {
int level = getNotificationManager().getPackageImportance("你的包名");
Log.e("zh", "level = " + level);
} catch (RemoteException e) {
e.printStackTrace();
}
}
获取某个应用的全部通知数据
/**
* 获取指定apk的全部通知数据
*/
public static void getStatusBarNotifications(){
try {
StatusBarNotification[] statusBarNotification = getNotificationManager().getActiveNotifications("你的包名");
for (StatusBarNotification item : statusBarNotification){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Log.e("zh", "getPackageImportance: " + item.getNotification().toString());
Log.e("zh","item = " + item.toString());
Log.e("zh","getKey = " + item.getKey());
Log.e("zh","getTag = " + item.getTag());
}
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
取消指定apk的全部通知
这里的UserId如何获取,请参考博客:Android系统开发 获取userId
/**
* 取消指定apk的全部通知
*/
public static void cancelAllNotifications() {
try {
getNotificationManager().cancelAllNotifications("你的包名", UserIdUtil.getCurrentUserId());
} catch (RemoteException e) {
e.printStackTrace();
}
}
待续....
end
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17376859.html