Android 中的CreatePackageContext()

2023-11-16

/**
     * Return a new Context object for the given application name.  This
     * Context is the same as what the named application gets when it is
     * launched, containing the same resources and class loader.  Each call to
     * this method returns a new instance of a Context object; Context objects
     * are not shared, however they share common state (Resources, ClassLoader,
     * etc) so the Context instance itself is fairly lightweight.
     *
     * <p>Throws {@link PackageManager.NameNotFoundException} if there is no
     * application with the given package name.
     *
     * <p>Throws {@link java.lang.SecurityException} if the Context requested
     * can not be loaded into the caller's process for security reasons (see
     * {@link #CONTEXT_INCLUDE_CODE} for more information}.
     *
     * @param packageName Name of the application's package.
     * @param flags Option flags, one of {@link #CONTEXT_INCLUDE_CODE}
     *              or {@link #CONTEXT_IGNORE_SECURITY}.
     *
     * @return A Context for the application.
     *
     * @throws java.lang.SecurityException
     * @throws PackageManager.NameNotFoundException if there is no application with
     * the given package name
     */
    
    Override
    public Context createPackageContext(String packageName, int flags)
        throws PackageManager.NameNotFoundException {
        if (packageName.equals("system") || packageName.equals("android")) {
            final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
            context.mBasePackageName = mBasePackageName;
            return context;
        }


        LoadedApk pi =
            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);
        if (pi != null) {
            ContextImpl c = new ContextImpl();
            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
            c.init(pi, null, mMainThread, mResources, mBasePackageName);
            if (c.mResources != null) {
                return c;
            }
        }


        // Should be a better exception.
        throw new PackageManager.NameNotFoundException(
            "Application package " + packageName + " not found");
    }

    主要作用是:创建其它程序的Context,通过创建的这个Context,就可以访问该软件包的资源,甚至可以执行其它软件包的代码。
    
    使用:
    
   try {  
        Context c = createPackageContext("com.dolphin.demo", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);  
    } catch (SecurityException e) {  
        e.printStackTrace();  
    } catch (Exception e) {  
        e.printStackTrace();  
    }

    通常一个软件是不能创建其它程序的Context的,除非它们拥有相同的用户ID与签名。用户ID是一个字符串标识,在程序的AndroidManifest.xml文件的manifest标签中指定,格式为android:shareUserId="**"。安装在设备中的每一个apk程序,Android系统会给其分配一个单独的用户空间,其中android:shareUserId就是对应一个Linux用户ID,并且为它创建一个沙箱,以防止与其它应用程序产生影响。用户ID 在应用程序被安装到设备中时分配。通过SharedUserid,拥有同一个Userid的多个APK可以配置成运行在同一个进程中,所以默认就是可以互相访问任意数据,也可以配置成运行在不同的进程中, 同时可以访问其APK的数据目录下的资源(图片,数据库和文件),就像访问本程序的数据一样。

    
   经常的用途:
   如经常一些应用提供的换皮肤功能,实现方法大致有两种:
   1)把需要替换的资源图片打包好之后,放在客户端指定的目录下面,切换皮肤,查找相应的资源时,直接切换资源查找的路径到该打包文件中对应的资源路径即可。
   2)把需要替换的资源,放在一个空的android 应用程序的drawable-**目录下面即可,编译,运行该apk,查找资源时,就需要用到createPackageContext获取对应包名的Context实例,然后通过context来查找对应的资源。查找时,也有两种方式:
   2.1)通过ID来查找资源图片;
       
 Context context;  
        try {  
            context = createPackageContext("com.dolphin.demo", Context.CONTEXT_INCLUDE_CODE  
                    | Context.CONTEXT_IGNORE_SECURITY);  
            txvA.setText(context.getResources().getText(R.string.message));  
        } catch (NameNotFoundException e) {  
            e.printStackTrace();  
        } 
        
   2.2)通过资源Name,反推出资源ID,然后查找对应的资源图片;
   
 /***  
     * @param clazz 目标资源的R.java  
     * @param className R.java的内部类,如layout,string,drawable...  
     * @param name 资源名称  
     * @return  
     */  
    private int getResourseIdByName(Class clazz, String className, String name) {  
        int id = 0;  
        try {  
  
            Class[] classes = clazz.getClasses(); // 获取R.java里的所有静态内部类  
            Class desireClass = null;  
  
            for (int i = 0; i < classes.length; i++) {  
                if (classes[i].getName().split("\\$")[1].equals(className)) {
                    desireClass = classes[i];  
                    break;  
                }  
            }  
            if (desireClass != null)  
                id = desireClass.getField(name).getInt(desireClass);
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
        } catch (SecurityException e) {  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        } catch (NoSuchFieldException e) {  
            e.printStackTrace();  
        }  
  
        return id;  
    }  
   
   
    Context context;  
    try {  
        context = createPackageContext("com.dolphin.demo", Context.CONTEXT_INCLUDE_CODE  
                | Context.CONTEXT_IGNORE_SECURITY);  
        Class cls = context.getClassLoader().loadClass("com.dolphin.demo.R"); // 获得目标apk的R类  
        txvA.setText(context.getResources().getText(getResourseIdByName(cls, "string", "message")));  
    } catch (NameNotFoundException e) {  
        e.printStackTrace();  
    } catch (ClassNotFoundException e) {  
        e.printStackTrace();  
    }  
   



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中的CreatePackageContext() 的相关文章

  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 如何让 Mockito 在 androidTest 中工作

    在我的测试中 我如何模拟我编写的课程 这是我的测试代码 import android support test runner AndroidJUnit4 import org junit Before import org junit Te
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • 如何在 JmsMessagingTemplate.sendAndReceive 上设置等待超时

    我在 MVC 控制器中使用 JmsMessagingTemplate 的 sendAndReceive 但如果没有发送回复消息 它似乎会永远等待回复 该文档指出 返回 回复 如果无法接收消息 例如由于超时 则可能为 null 然而 我只是不
  • 如何在捆绑中存储稀疏数组

    我有一个SparseArray
  • 地理围栏不可用以及如何处理

    我正在 Android 上使用地理围栏 它在大多数手机上都工作正常 但在其中一些上 它不起作用 在我的错误日志中显示 地理围栏不可用 某些用户没有为 Google Play 服务启用位置跟踪 我认为这就是地理围栏在他们的手机上不起作用的原因
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 布局聊天气泡问题:TextView 占满整个屏幕

    我正在研究泡泡聊天 我使用具有两种布局的适配器 一种用于传入消息 另一种用于我的消息 适配器工作正常 我的问题在于传入布局 无法很好地显示传入时间文本 当消息文本增长时 会填满屏幕的整个宽度 并隐藏消息时间的文本 第一个问题 如何才能实现这
  • 为 REST API 生成 Swagger UI 文档

    我使用 Java 中的 JAX RS Jersey 开发了 REST API 我想为其转换 生成基于 Swagger 的 UI 文档 谁能以简单的方式告诉我如何做到这一点的精确 步骤 很抱歉 他们网站上给出的步骤对我来说有点模糊 有多种方法
  • Spring Security 角色层次结构不适用于 Thymeleaf sec:authorize

    我正在使用 Spring Security 3 2 5 RELEASE 和 ThymeLeaf 2 1 4 RELEASE 我已经在安全上下文中定义了角色层次结构 在我的视图层中我正在使用sec authorize属性来定义菜单项 我希望看
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • Spring 如何在运行时获取有关“强类型集合”的泛型类型信息?

    我在 Spring 3 0 文档中阅读了以下内容 强类型集合 仅限 Java 5 在 Java 5 及更高版本中 您可以使用强类型集合 使用泛型类型 也就是说 可以声明一个 Collection 类型 使其只能包含 String 元素 例如
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • 使用Gradle组装时如何更改Android应用程序包名称?

    是否可以使用 Gradle 更改 Android 应用程序的包名称 我需要编译同一应用程序的两个副本 并具有唯一的包名称 这样我就可以向市场发布两次 作为使用的更简单的替代方案产品口味 正如伊森的回答 https stackoverflow
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果

随机推荐

  • Java快速入门

    Java快速入门 Java概述 JDK介绍下载安装 入门程序HelloWorld JDK JRE 跨平台 Java程序执行原理 1 人机交互 1 1 什么是cmd 就是在windows操作系统中 利用命令行的方式去操作计算机 我们可以利用c
  • lego ev3 c语言编程,乐高 EV3 高级编程 – 第一课:安装

    我的学生写的教程 英文版的 好吧 我翻译一下 先介绍一下我的学生 今年 12 岁 2018年 普通 2 等中学初中 2 年级 学校名字就不说了 说了你也没听过 除了数学和科学比较好 其他科目成绩一般 学习电脑编程 3 年 大概每星期学 2
  • echarts使用API查看新增商品数量

    echarts使用API查看新增商品数量 echarts官网 http echarts baidu com index html 帮助文档 http echarts baidu com api html echarts 下载地址 http
  • 前后端分离 个人博客系统 (源码)

    该项目为个人博客系统 相对较为简单 比较适合新手学习 博客分为前台与后台 以三更博客为内容 前台展示页面 导航栏包括首页 分类 赞赏 友联 右下部分展示热门文章及浏览次数 文章详情页 可在底部进行评论 以及显示浏览量 友联 也可以进行评论
  • 项目范围和项目范围管理

    项目的范围包括项目的最终产品或服务以及实现该产品或服务所需要开始的各项具体工作 1 项目产品范围 项目所要生产的产品或服务的特征和功能 2 项目工作范围 项目范围管理是指为了成功完成项目 对项目工作包括什么与不包括什么的定义与控制过程 项目
  • python实现md5加密

    python实现MD5加密 1 简介 Message Digest Algorithm MD5 中文名为消息摘要算法第五版 为计算机安全领域广泛使用的一种散列函数 用于确保信息传输完整一致 MD5是单向加密 指只能加密数据而不能解密数据 主
  • 【FAQ】TheBrain最新最热问答集锦

    TheBrain是一款与众不同的思维导图软件 其所有信息通过一个又一个的节点进行联系 最终形成一个杂而不乱的网状结构 TheBrain功能亮点 数字思维 整合分散的资源 随时访问 快速搜索 强大的文档管理功能 一目了然的图形 最新版TheB
  • 去阿里面试到第三轮的时候,会如何360度无死角考察你?

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 业务背景介绍 2 架构演进考察 3 对公司底层技术的原理考察 4 系统难点的考察 5 擅长技术的考察 6 总结 这篇文章 给大家分享一个同学面试阿里某个部门
  • 回归分析的基本步骤与自相关性

    一个回归分析的步骤 1 用scat x y 查看散点图 2 使用适当的模型进行回归分析 ls 估计出参数 3 统计检验 包括拟合优度检验和模型显著性检验 4 时间序列数据要做自相关性分析 横截面数据做异方差性检验 4 检查是否有多重共线性
  • Linux环境Ubuntu源码部署odoo15

    部署之前首先升级apt 否则所有的包都无法获取 sudo apt get update PostgreSQL相关 安装数据库 sudo apt get install postgresql 安装数据库客户端 sudo apt get ins
  • Java实现一个简单的命令行聊天程序

    Socket编程 Java实现 客户端 package net import java io BufferedReader import java io InputStreamReader import java io PrintWrite
  • SaaS、ERP、CRM、PaaS、IaaS概念

    layout post title SaaS ERP CRM PaaS IaaS概念 categories 实施工程 tags SaaS SaaS Software as a Service 软件即服务 SaaS首先是一个模式 其次也可理解
  • 开发支付宝小程序对比开发微信小程序

    接触使用开发支付宝小程序 之前弄微信小程序现在也做一点点支付宝小程序的需求 发现支付宝小程序和微信小程序这两者还有很多东西是共通的 当然也有很多差异 本文旨在在自己接触的过程中进行对比总结 会一直更新比较 1 开发工具 提供功能 开发工具上
  • redis专题-----11-----redis订阅发布以及stream

    参考文章 Redis发布订阅模式 publish subscribe 一 订阅发布 1 概念 1 为了支持消息的多播机制 redis 引入了发布订阅模块 Redis发布 订阅 Pub Sub 是一种通信机制 将数据推到某个信息管道中 其他客
  • 前端不规则气泡图实现方案

    背景介绍 由于项目大屏可视化的需求 需要实现在一个不定长宽的长方形容器中 实现不重叠分布的气泡图 每个气泡代表一类数据的统计值 气泡个数最大值已知 气泡大小与数据值大小正相关 并且气泡图需要有浮动特效 页面尺寸改变时 气泡尺寸需要自适应容器
  • 微信小程序0基础到精通

    写在开头 此篇文章只是简单描述了一下一条学习路线 具体学习资源获取方式请看文末 第一步 想快速入门小程序开发就需要从必备的API和核心开发等基础知识入手 建立整个小程序的知识体系 学习目标 新手入门与项目实战 课程重点 1 小程序核心技术
  • 计算机原理提问,计算机原理的计算机原理人话版

    Windows关机步骤涉及到Windows多个组件和多个过程 简单的说 Windows的关机步骤不是大多数人认为的那么简单 基本的过程是这样的 1 用户发起关机指令以后 发起关机指令的程序会通知Windows子系统CSRSS EXE CSR
  • 提高ChatGPT稳定性:告别GPT网页登录使用PC软件进入GPT

    一 GPT时不时断线 在日常生活中 我们经常需要使用智能语言模型来辅助我们完成各种任务 而ChatGPT作为一款非常优秀的智能语言模型 被广泛应用于各个领域 然而 使用ChatGPT的过程中 我们不可避免地会遇到一个非常让人头疼的问题 Ch
  • javaee之黑马乐优商城4

    商品规格与数据结构 下面来说一下数据库的设计与分析 其实对于spu这张表来说 大体设计还是比较好设计的 看一下下面这张图是一个产品的规格参数 上面主体就是一个规格参数 基本信息又是一个规格参数 这里就是涉及到了一个商品的具体信息 sku就是
  • Android 中的CreatePackageContext()

    Return a new Context object for the given application name This Context is the same as what the named application gets w