在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” 位置,可以看到如下信息:

 // EmailIntent 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主文件<intent-filter >内有/*<action android:name="android.intent.action.MAIN" />/*字段的节点将作为检索目标*/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<String> 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文件:

 <resolvelauncher:container="-101"launcher:screen="0"launcher:x="0"launcher:y="0" ><favorite launcher:uri="#Intent;action=android.intent.action.DIAL;end" /><favorite launcher:uri="tel:123" /><favorite launcher:uri="#Intent;action=android.intent.action.CALL_BUTTON;end" /></resolve>这是第一个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<favorite launcher:uri="#Intent;action=android.intent.action.DIAL;end" />
这一句也就是指定加载的APP,当前这段表示加载的是系统APP(在intent.java中有定义)

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

 <!--resolvelauncher:container="-101"launcher:screen="0"launcher:x="0"launcher:y="0" ><favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_SETTINGS;end" /></resolve-->在<favorite launcher:uri="#Intent;action=android.intent.action.MAIN;
category=android.intent.category.APP_SETTINGS;end" />这段代码中可以看到
我们指定了探索<favorite 中包含main字段的节点,category类型为APP_SETTINGS
的应用程序

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

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

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
+ <category android:name="android.intent.category.APP_SETTINGS" />
</intent-filter>找到包含<intent-filter>节点下包含<action android:name=
"android.intent.action.MAIN" />的节点,在这个节点中增加自定义的类型
<category android:name="android.intent.category.APP_SETTINGS" />

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

AOSP6.0.1相关文章:

<AOSP6.0.1 launcher3入门篇—解析launcher.java文件>
<AOSP6.0.1 launcher3入门篇-解析DeviceProject.java及相关文件>
<AOSP6.0.1 launcher3入门篇—hotseat相关实现>

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

  1. 操原上机(一) 在Linux系统中增加新的系统调用

    在LINUX中增加新的系统调用 编写新的系统调用函数(指函数实现部分) 注册新的系统调用(声明系统调用函数和编号) 编译新LINUX内核 编译和安装模块 启动新的LINUX内核 编写应用程序测试新的系 ...

  2. linux如何右键新建文件夹,在Ubuntu 18.04右键菜单中增加新文档(New Document)及其他类型选项...

    本文教你在Ubuntu 18.04操作系统下使用命令操作在右键菜单中增加"新文档(New Document)"选项,包括为不同文件类型增加右键菜单选项的方法.起因是当我尝试创建一个 ...

  3. 在ECSHOP后台左侧导航中增加新菜单

    在ECSHOP后台左侧导航中增加新菜单 ECSHOP教程 / ecshop 教程网(www.ecshop119.com) 2011-11-08 有个别高级用户(懂PHP的),提到这样的问题: 在后台管 ...

  4. SMLT中增加新的语言

    1.SMLT,增加新的语言,如果提示NLS错误 ->2 2.se38中执行RSCPINST,在NLS中增加新的语言 3.选中语言,选择菜单 import language 4.输入补丁文件路径, ...

  5. Linux内核模块下载到板子,在Linux内核中增加新驱动模块

    开发环境 开发板:A33-Vstar 开发板系统: Linux/arm 3.4.39 Kernel Ubuntu版本:Ubuntu14.04 ----------------------------- ...

  6. mysql在视图中增加新数据_怎么向Mysql视图中增加新数据

    本篇文章主要给大家介绍mysql数据表中视图是怎么新增数据的. mysql视图的相关知识在我们之前的文章中,都已经给大家详细介绍过了,相信大家对视图肯定有了更深一步的了解. 从前面文章的介绍中,大家应 ...

  7. 向视图插入数据mysql_怎么向Mysql视图中增加新数据

    本篇文章主要给大家介绍mysql数据表中视图是怎么新增数据的. mysql视图的相关知识在我们之前的文章中,都已经给大家详细介绍过了,相信大家对视图肯定有了更深一步的了解. 从前面文章的介绍中,大家应 ...

  8. Android 12.0修改系统默认设备类型的平板电脑类型为设备类型

    1.概述 在12.0的系统rom产品开发中,对于产品设备类型都默认为tablet即平板电脑类型,即 product="tablet" 在一些不是平板的项目中,可能需要修改这个类型为 ...

  9. Mysql要在表s中增加一列可用什么语句_要在基本表S中增加一列CN(课程名),可用语句()_学小易找答案...

    [填空题]在SQL中,要删除一个表,应使用的语句是( )TABLE. [单选题]精神检查的方法主要有( ) [单选题]护士从病人的书信.日记了解病人的情况是属于( ) [单选题]显示当前所有数据库的命 ...

最新文章

  1. RabbitMQ基本概念(一)-RabbitMQ的优劣势及产生背景
  2. thinkcmf安装模板需要点击右键打开新页面的解决办法
  3. 成功解决运行tensorflow时ModuleNotFoundError: No module named ‘numpy.core._multiarray_umath‘
  4. IDEA 15款神级良心插件强烈推荐收藏,提高一倍工作效率!
  5. SpringBatch tasklet实现和用法(十)
  6. 三极管和MOS管有什么不一样?用MOS管还是三极管?
  7. netty socket_Netty:另一种Web(Socket)服务器
  8. NB-IOT和LoRa技术优劣对比
  9. python语言学完后学什么_学完Python语言可以做什么?发展前景怎么样?
  10. 开发者福音!面向Web场景的云开发服务正式开放!
  11. 【EOJ Monthly 2019.01 - E】唐纳德先生与假骰子(假概率问题)
  12. Apache与Tomcat的区别
  13. LRUCache和FastLRUCache实现分析
  14. Directshow播放框架详解
  15. 凝胶渗透色谱法——聚合物相对分子质量分布的测定
  16. mysql中 怎么插入反斜杠_MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义(转)...
  17. 设备巡检维修报备小程序开发制作功能介绍
  18. Acwing2041. 干草堆
  19. b站python弹幕签到_B站弹幕实时效果python
  20. C#-获取当前程序集Assembly的文件名

热门文章

  1. Kafka 慌了!这个中间件,要火了?
  2. 插件一:JAVA微信砍价活动源码分享[商品帮砍到0元,免费领取奖品]
  3. UI标签库专题四:JEECG智能开发平台 Upload(上传标签)
  4. SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
  5. linux系统监控和进程管理
  6. Date动态获取时间
  7. ORA-01919: role 'OLAPI_TRACE_USER' does not exist
  8. 在命令行中将CentOS 7与Samba4 AD集成
  9. 怎样在Android上手动备份你的短信/彩信?
  10. 使用 Vue.js 和 Chart.js 制作绚丽多彩的图表