欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android Apps & Notifications 源码解析记录(一)

程序员文章站 2022-05-14 21:14:28
...

Android Apps & Notifications 源码解析记录(一)

引言

这是我第一次使用博客来记录Android学习和使用过程中积累。有些使用过的东西,以后的工作中可能会用到,用这种方式来方便自己今后查阅,也希望对大家有所帮助。因为能力有限,文中有不足或是错误的地方还请见谅

这次博客的内容

对源码Setting部分 Apps & Notifications功能实现的页面进行定位,方便实现功能时查看,后续会记录功能具体实现的过程,和遇到的问题。

  1. Applications

1)获得应用列表:
这里只是Android 原生Setting中所展示的应用列表,通过查看源码,在ApplicationsState.java 文件中,获得 应用列表的方法如下:

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> mApps = mPackageManager.queryIntentActivities(mainIntent, PackageManager.MATCH_DISABLED_COMPONENTS
        | PackageManager.MATCH_DIRECT_BOOT_AWARE
        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);

2)单个应用详细信息页面:
android 源码里InstalledAppDetails,.java文件 ,主要对应的功能Uninstall, Notifications,Permissions,Storage,Data usage。
每个功能对应的页面:

功能 源码java文件
Notifications AppNotificationSettings.java
Permissions ManagePermissionsActivity.java
Storage AppStorageSettings.java
Data usage AppDataUsage.java
  1. Notifications
    1)对AppNotificationSettings.java的解析后,得出的主要功能:打开通知
  public void setNotificationForPackage(String pkgName, boolean enabel) {
        UILog.d(TAG, "setNotificationForPackage: " + pkgName);
        try {
            ApplicationInfo info = mPackageManager.getApplicationInfo(pkgName, PackageManager.GET_META_DATA);
            NotificationChannel channel = mNotificationManager.getNotificationChannelForPackage(pkgName, info.uid, NotificationChannel.DEFAULT_CHANNEL_ID, true);
            if (channel != null) {
                final int importance = enabel ? NotificationManager.IMPORTANCE_UNSPECIFIED : NotificationManager.IMPORTANCE_NONE;
                channel.setImportance(importance);
                channel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
                mNotificationManager.updateNotificationChannelForPackage(pkgName, info.uid, channel);
            }
            mNotificationManager.setNotificationsEnabledForPackage(pkgName, info.uid, enabel);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
  1. Permissions
    1)管理Permissions 的ManagePermissionsActivity.java 代码的查看,这个是所有权限的类通过通过 Intent启动时传递的参数,判断单个应用还是所有应用权限管理,后续的功能细节需要展开页面
Intent 对应Fragment
Intent.ACTION_MANAGE_PERMISSIONS 权限组管理
Intent.ACTION_MANAGE_APP_PERMISSIONS 应用的权限组管理
Intent.ACTION_MANAGE_PERMISSION_APPS 权限组的应用管理
相关标签: android permission