Android 中的CreatePackageContext()

2023-10-31

http://blog.csdn.net/wangbole/article/details/22876179

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.      * Return a new Context object for the given application name.  This 
  3.      * Context is the same as what the named application gets when it is 
  4.      * launched, containing the same resources and class loader.  Each call to 
  5.      * this method returns a new instance of a Context object; Context objects 
  6.      * are not shared, however they share common state (Resources, ClassLoader, 
  7.      * etc) so the Context instance itself is fairly lightweight. 
  8.      * 
  9.      * <p>Throws {@link PackageManager.NameNotFoundException} if there is no 
  10.      * application with the given package name. 
  11.      * 
  12.      * <p>Throws {@link java.lang.SecurityException} if the Context requested 
  13.      * can not be loaded into the caller's process for security reasons (see 
  14.      * {@link #CONTEXT_INCLUDE_CODE} for more information}. 
  15.      * 
  16.      * @param packageName Name of the application's package. 
  17.      * @param flags Option flags, one of {@link #CONTEXT_INCLUDE_CODE} 
  18.      *              or {@link #CONTEXT_IGNORE_SECURITY}. 
  19.      * 
  20.      * @return A Context for the application. 
  21.      * 
  22.      * @throws java.lang.SecurityException 
  23.      * @throws PackageManager.NameNotFoundException if there is no application with 
  24.      * the given package name 
  25.      */  
  26.       
  27.     Override  
  28.     public Context createPackageContext(String packageName, int flags)  
  29.         throws PackageManager.NameNotFoundException {  
  30.         if (packageName.equals("system") || packageName.equals("android")) {  
  31.             final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());  
  32.             context.mBasePackageName = mBasePackageName;  
  33.             return context;  
  34.         }  
  35.   
  36.   
  37.         LoadedApk pi =  
  38.             mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);  
  39.         if (pi != null) {  
  40.             ContextImpl c = new ContextImpl();  
  41.             c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;  
  42.             c.init(pi, null, mMainThread, mResources, mBasePackageName);  
  43.             if (c.mResources != null) {  
  44.                 return c;  
  45.             }  
  46.         }  
  47.   
  48.   
  49.         // Should be a better exception.  
  50.         throw new PackageManager.NameNotFoundException(  
  51.             "Application package " + packageName + " not found");  
  52.     }  

    主要作用是:创建其它程序的Context,通过创建的这个Context,就可以访问该软件包的资源,甚至可以执行其它软件包的代码。
    
    使用:
    
[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. try {    
  2.      Context c = createPackageContext("com.dolphin.demo", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);    
  3.  } catch (SecurityException e) {    
  4.      e.printStackTrace();    
  5.  } catch (Exception e) {    
  6.      e.printStackTrace();    
  7.  }  

    通常一个软件是不能创建其它程序的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来查找资源图片;
       
[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. Context context;    
  2.        try {    
  3.            context = createPackageContext("com.dolphin.demo", Context.CONTEXT_INCLUDE_CODE    
  4.                    | Context.CONTEXT_IGNORE_SECURITY);    
  5.            txvA.setText(context.getResources().getText(R.string.message));    
  6.        } catch (NameNotFoundException e) {    
  7.            e.printStackTrace();    
  8.        }   
        
   2.2)通过资源Name,反推出资源ID,然后查找对应的资源图片;
   
[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. /***   
  2.     * @param clazz 目标资源的R.java   
  3.     * @param className R.java的内部类,如layout,string,drawable...   
  4.     * @param name 资源名称   
  5.     * @return   
  6.     */    
  7.    private int getResourseIdByName(Class clazz, String className, String name) {    
  8.        int id = 0;    
  9.        try {    
  10.    
  11.            Class[] classes = clazz.getClasses(); // 获取R.java里的所有静态内部类    
  12.            Class desireClass = null;    
  13.    
  14.            for (int i = 0; i < classes.length; i++) {    
  15.                if (classes[i].getName().split("\\$")[1].equals(className)) {  
  16.                    desireClass = classes[i];    
  17.                    break;    
  18.                }    
  19.            }    
  20.            if (desireClass != null)    
  21.                id = desireClass.getField(name).getInt(desireClass);  
  22.        } catch (IllegalArgumentException e) {    
  23.            e.printStackTrace();    
  24.        } catch (SecurityException e) {    
  25.            e.printStackTrace();    
  26.        } catch (IllegalAccessException e) {    
  27.            e.printStackTrace();    
  28.        } catch (NoSuchFieldException e) {    
  29.            e.printStackTrace();    
  30.        }    
  31.    
  32.        return id;    
  33.    }    
  34.     
  35.     
  36.    Context context;    
  37.    try {    
  38.        context = createPackageContext("com.dolphin.demo", Context.CONTEXT_INCLUDE_CODE    
  39.                | Context.CONTEXT_IGNORE_SECURITY);    
  40.        Class cls = context.getClassLoader().loadClass("com.dolphin.demo.R"); // 获得目标apk的R类    
  41.        txvA.setText(context.getResources().getText(getResourseIdByName(cls, "string""message")));    
  42.    } catch (NameNotFoundException e) {    
  43.        e.printStackTrace();    
  44.    } catch (ClassNotFoundException e) {    
  45.        e.printStackTrace();    
  46.    }    
  47.     

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

Android 中的CreatePackageContext() 的相关文章

  • Android中的列表树形展示,AndroidTreeView的使用动态设置树形结构

    1 在项目中用到了这个控件 展示并选择某公司的部门 但是在使用过程中又出一个问题 我并不知道该公司有几个部门 部门下面是否有子部门 2 实现步骤如下 开发工具 Android studio 在项目中添加依赖 compile com gith
  • Android 对data/data/(your packagename)目录下的数据读写、删除操作

    一 数据存储 App自身的数据存储在 data data packagename 目录下 大致结构如下图 Activity提供了getCacheDir 和getFilesDir 方法 getCacheDir getAbsolutePath
  • UncaughtExceptionHandler加Process 让应用程序不异常崩溃退出

    我们在开发应用程序时难免会遇到出现没有被try catch抓住的RunTimeException信息 从而导致程序异常崩溃退出 大大的影响了用户体验 那么有没有什么方法能避免这一现象呢 网上一查资料 果然有 UncaughtExceptio
  • 耗时操作ANR和handler

    耗时操作 1 什么是ANR 在应用程序的主线程中执行一段耗时的代码 就有可能出现ANR异常 耗时的代码未执行结束时 界面会卡住 用户对界面进行了操作 10秒之后耗时代码如果还未结束 就会出现ANR异常 2 怎么避免ANR 主线程中不要执行耗
  • 自定义时间Toast(只弹一次)

    CToast类 package com pinkman dota util import com pinkman dota R import android content Context import android graphics C
  • 设置ImageButton的点击效果

    我要设置一个ImageButton的点击效果 普通状态背景透明 按下状态有一个背景图 src是一个图片 如下所示
  • Android 开发最佳实践

    https github com futurice android best practices blob master translations Chinese README cn md 组织好它们 在layoutout XMLs布局时
  • FloatingActionButton的使用

    FloatingActionButton FAB 是 Android 5 0 新特性 Material Design 中的一个控件 是一种悬浮的按钮 FloatingActionButton 是 ImageView 的子类 因此它具备Ima
  • 『Android Studio』用Fragment实现一个简易新闻浏览界面

    Fragment意思为碎片 片段 在Android中有些Activity在手机上看起来很美观 但放在屏幕更大的平板类的设备上 可能就不一样了 而Fragment能在一个Activity中内嵌多个独立的小Activity 有效的解决了app在
  • Android解决问题的思路

    1 前言 授人以鱼不如授人以渔 当向别人请教了问题且被解答了疑惑后 或许也想知道对方是如何思考 如何按照一定的的逻辑得出最终的答案 故想分享一下我这6年Android开发中是如何解决问题的 一家之言 请同学们多多指教 2 指导性原则 第一点
  • Android Service最全面的解析

    本篇文章再次来自 刘明渊 话说刘明渊已经是我公众号的老熟人了 这是第三次发表他投稿的文章 前两篇关于Intent的译文都广受大家好评 而本篇对于Service的译文同样精彩 其实像这种官方文档翻译类文章的投稿我都是非常欢迎的 因为官方文档的
  • Android 架构设计的思想与原则是什么?

    http www zhihu com question 19717380
  • Android基础-Service和IntentService知识点详细总结

    Service 对于广大的Android开发者来说算是耳熟能详了 作为Android的四大组件之一 在我们的开发中也起着重要的作用 在Android面试中 Service相关的问题也是面试官问得比较多的 当别人问你 Service 到底是什
  • hint和输入都是在EditText的左上角

    2012 8 8 09 59 55 上传 下载附件 2 16 KB 如何实现这种效果 hint和输入都是在EditText的左上角 android gravity top left
  • adb logcat命令查看并过滤android输出log

    http blog csdn net hansel article details 38088583 cmd命令行中使用adb logcat命令查看Android系统和应用的log dos窗口按ctrl c中断输出log记录 logcat日
  • 【Android】DataBinding 最全使用解析

    DataBinding 最全使用解析 一 DataBinding 概述 二 基本用法 2 1 使用入门 2 2 布局和绑定表达式 2 3 事件绑定 2 4 单向绑定 2 5 双向绑定 三 高级用法 BindingAdapter 一 Data
  • 使用ADB指令永久隐藏或禁用状态栏和虚拟按键

    原理是强大的ADB命令 1 手机开启开发者模式 允许ADB调试 2 电脑上下载ADB包 adb rar 529 77 KB 下载次数 7681 3 解压到任意位置 比如c adb 4 cmd命令定位到adb目录 比如 cd c adb 5
  • Android四大组件-BroadcastReceiver、ContentProvider、Service

    目录 一 BroadcastReceiver 1 定义 2 作用 3 生命周期 4 广播注册方式 动态注册 静态注册 5 广播类型 普通广播 即发出广播后所有接收者都能收 有序广播 按照广播的优先级接受 broadcastReceiver可
  • ndk错误总结

    1 ndk Unresolved inclusion
  • 多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件 支持暂停 取消 断点续传 多线程同时下载文件即 在同一时间内通过多个线程对同一个请求地址发起多个请求 将需要下载的数据分割成多个部分 同时下载 每个线程只负责下载其中的一部分 最后将每一个线程下载的部分组装起来即可 涉及的知

随机推荐

  • matlab中if elseif语句,Matlab if…elseif…elseif…else…end语句

    if语句后面可以有一个 或多个 可选elseif 和一个else语句 这对于测试各种条件非常有用 当使用if elseif else语句时 请记住几点 if可以有零个或一个else 它必须在elseif之后 if可以有零到多个elseif
  • (python编程)k-shell的实现

    一 k shell 算法 改错 他发的代码报错 def kshell graph importance dict ks 1 while graph nodes temp node degrees dict for i in graph de
  • python之标准库使用

    目录 一 标准库 二 字符串操作 三 字符串类型 四 时间操作 五 文件基本方法及操作 文件基本方法 文件操作 一 标准库 Python 标准库非常庞大 所提供的组件涉及范围十分广泛 正如以下内容目录所显示的 这个库包含了 Python中的
  • Activiti7 监听器【十四】

    Activiti 7系列文章目录 文章代码下载 Activiti7 工作流设计器 一 Activiti7 创建表 二 Activiti7 表结构介绍 三 Activiti7 设计器创建流程 四 Activiti7 部署流程 五 Activi
  • maven打包出错:Failed to execute goal org.sp

    Failed to execute goal org springframework boot spring boot maven plugin 2 2 13 RELEASE repackage default on project bla
  • 数学建模——数据分析方法

    一 常见数据分析软件 Excel office三件套之一 R语言 Eviews origin 图形分析工具 SPSS 统计分析与数据挖掘 MATLAB 墙裂推荐 python 墙裂推荐 SAS 二 统计性描述 均值 mean x
  • 第一次参加蓝桥杯的心得

    随着我的4道题的答案提交后 蓝桥杯第十届比赛落下帷幕 这其中我也是参赛者 对于这次比赛 虽然我是一位小白 但是我也有不少的感悟 因为这一次也是我从小到大参加的第一次大型竞赛 所以我做了以下的总结 这次的比赛是在长沙理工大学比赛 所以对于我来
  • Swin-Unet:Swin Transformer在医学分割上的首次尝试

    Swin Unet Swin Transformer在医学分割上的首次尝试 前言 最近小编主要在搞一些医学图像分割的工作 也跑了一下Swin Unet 之前看到也看到过这篇Swin Unet 其实五月份就看到了hhhh 决定搬运过来 实际上
  • 前端报错500

    后台代码错误无法返回值 检查后台代码
  • log4j:WARN No appenders could be found for logger 的解决方法

    一 SSH在使用Log4j进行日志管理时常会遇到这个异常 log4j WARN No appenders could be found for logger org springframework web context ContextLo
  • STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一 SHT30温湿度传感器原理图 二 代码部分 1 SHT30 c文件 2 SHT30 h文件 总结 前言 SHT30是一种常见的温湿度传感器 该传感器广泛应用于各种场景 小米的温湿度传感器就是使用的SHT30 本文是已硬件
  • java Consumer接口与示例

    目录 一 consumer使用 示例代码1 示例代码2 示例代码3 示例代码4 二 BiConsumer使用 示例代码一 示例代码二 三 其他和Consumer相关的接口 Java 8 中的 Consumer 是一个函数接口 它可以接受一个
  • opc matlab gui,OPC Server/Client Demo

    Hi thanks a lot for posting this app I m a student and my assignment is to create a simple OPC client server application
  • 牛顿法/递归法实现开方的函数功能

    Filename sqrt method cpp Description Version 1 0 Created 12 27 2016 03 15 18 PM Revision none Compiler gcc Author YOUR N
  • 英语口语413之每日二十个英语单词

    2020 09 01每日二十个英语单词 synchronization 同步化 synchronization multiprocessor 多处理器同步化 synchronized multimedia integration langu
  • buctoj-python 2022.6.19

    A 对指定r计算圆的面积 题目描述 编写函数getCircleArea 对给定的参数r计算圆的面积 并返回 首先读入n n gt 0 然后依次读入n个半径r1 r2 rn 以这些半径为参数依次调用getCircleArea函数 得到对应圆的
  • 管理员权限运行批处理的几种方法

    废话不说 解决win7运行批处理出错不能注册dll等问题 1 在批处理的第一行加入 cd d dp0 然后在批处理上右键选择使用管理员权限运行 2 右键任务栏 选择资源管理器 进程选项卡 显示所有用户的进程 结束explorer 文件 新建
  • HJ59 找出字符串中第一个只出现一次的字符

    描述 找出字符串中第一个只出现一次的字符 数据范围 输入的字符串长度满足 1 le n le 1000 1 n 1000 输入描述 输入一个非空字符串 输出描述 输出第一个只出现一次的字符 如果不存在输出 1 示例1 输入 asdfasdf
  • linux下查看文件大小:ls或du

    方法1 ls lh 参数解释 l 除文件名称外 亦将文件型态 权限 拥有者 文件大小等资讯详细列出 h human readable 与 l 一起 以易于阅读的格式输出文件大小 例如 1K 234M 2G t 文件显示以修改时间排序 最新修
  • Android 中的CreatePackageContext()

    http blog csdn net wangbole article details 22876179 java view plain copy print Return a new Context object for the give