AOSP6.0.1 系统中增加新的category类型与app绑定,并在hotseat容器中加载app

  在launcher3(桌面程序)的hotseat中,可以通过修改dw_phone_hotseat.xml在指定位置加载指定app(仅限于已经指定category类型为APP_xxxx的app或者是系统APP(这里不描述关于系统APP事件定义方式))。如果想在hotseat中加载自己编写app,比较省事的一种方式是在系统中增加新的category类型,类型可以任意命名(这里以APP_SETTINGS做示范),下面介绍增加新的category类型以及hotseat中指定app的方法。

  一.增加新的category类型:

    首先打开frameworks/base/core/java/android/content/intent.java文件:
      我们可以看到intent事件类型是在这个文件中定义,其中包括一些系统级app的启动事件、category类型定义等。在这里我们仿照已存在的category为APP_xxxx的类型 作为示例,首先在intent.java文件中搜索到 “CATEGORY_APP_EMAIL” 位置,可以看到如下信息:

  @SdkConstant(SdkConstantType.INTENT_CATEGORY)
  public static final String CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL";
    这是APP_EMAIL类型的定义方式,和ACTION_MAIN一起使用,
    用来启动邮件应用程序(如果把APP_EMAIL写在dw_phone_hotseat.xml中,将在
    hotseat指定位置加载app图标)

      下面我们仿照“CATEGORY_APP_EMAIL”的形式增加自己的类型定义

在“CATEGORY_APP_EMAIL”定义下方,增加下面一段代码:

/**
   * 增加自定义类型,Settings,可以根据实际情况自定义名称
   */
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String CATEGORY_APP_SETTINGS = "android.intent.category.APP_SETTINGS";

      保存文件,新的category类型增加完成,下面启动新增加的类型:

        打开frameworks/base/sevices/core/java/com/android/serives/pm/DefaultPermissionGrantPolicy.java文件:
          这里把Intent类型以包的形式进行封装,然后放入运行时(包管理器服务)(动态加载Intent信息,在应用层可以获取到已经加载的Intent指针(在这里也可以称为实例))。我们继续模仿已存在的category为APP_xxxx的类型 作为示例,首先在DefaultPermissionGrantPolicy.java文件中搜索到 “CATEGORY_APP_EMAIL” 位置,可以看到如下信息:

 // Email
            Intent emailIntent = new Intent(Intent.ACTION_MAIN);
            emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
            PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackageLPr(
                    emailIntent, userId);
            if (emailPackage != null
                    && doesPackageSupportRuntimePermissions(emailPackage)) {
                grantRuntimePermissionsLPw(emailPackage, CONTACTS_PERMISSIONS, userId);
            }

        下面我们仿照“CATEGORY_APP_EMAIL”的形式增加自己的启动方式

在“CATEGORY_APP_EMAIL”代码下方,增加下面一段代码:

//增加自定义种类Settings,根据实际情况使用自己定义的类型
            Intent SettingsIntent = new Intent(Intent.ACTION_MAIN);
            /**这里我们也是指定了APP主文件内有
            /*
			/*字段的节点将作为检索目标*/
			
            SettingsIntent.addCategory(Intent.CATEGORY_APP_SETTINGS);
            PackageParser.Package SettingsPackage = getDefaultSystemHandlerActivityPackageLPr(
                    SettingsIntent, userId);
            if (SettingsPackage != null
                    && doesPackageSupportRuntimePermissions(SettingsPackage)) {
                grantRuntimePermissionsLPw(SettingsPackage, CONTACTS_PERMISSIONS, userId);
            }

          这里需要说明的是 “CONTACTS_PERMISSIONS” 字段,追踪 “CONTACTS_PERMISSIONS” 的定义处:

 private static final Set CONTACTS_PERMISSIONS = new ArraySet<>();
    static {
        CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
        CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
        CONTACTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
    }

可以看到 “CONTACTS_PERMISSIONS” 字段的作用是设置自定义类型(在容器内)的权限,
比如自定义类型绑定了一个app,app在当前容器内启动时将有这些访问权限
使用者请根据实际情况来定义权限

      保存文件,新的category类型增加完成,下面是编译工作

        1.在源码文件夹根位置执行 mm frameworks/base/core/;
        2.执行 mm frameworks/base/sevices/;




  二.hotseat中指定app的方法:

      打开 packages/apps/Launcher3/res/xml/dw_phone_hotseat.xml文件:

 
        
        
        
    

这是第一个APP节点:
launcher:screen="0"  表示当前第几个APP所对应在hotseat内的屏幕范围,0表示
第一个
 
launcher:x="0"   表示在hotseat容器内屏幕最左边的位置,最大为4,
其中2 为allapps按钮位置(在dw_phone_hotseat.xml中设置2将会被allapps按钮覆盖)
可以设置的参数为0,1,3,4 ,APP位置变化是从左向右
 
 launcher:y="0"  hotseat只有一行的情况下 launcher:y为0


这一句也就是指定加载的APP,当前这段表示加载的是系统APP(在intent.java中有定义)

      下面附上在第一个APP位置加载我们自定义的APP

 这段代码中可以看到
我们指定了探索

      保存文件,下面修改我们想要加载的app主文件:

        打开packages/apps/Settings/AndroidManifest.xml文件:





+ 


找到包含节点下包含的节点,在这个节点中增加自定义的类型

          保存文件,重新编译修改过的APP,和Launcher3程序,并make snod更新到.img文件中,启动系统后可以看到hotseat第一个app是我们自定义的APP了,修改第二个及后面的APP和这种方式大致相同。

AOSP6.0.1相关文章:



你可能感兴趣的:(安卓系统,探索安卓)