当前位置: 首页 > news >正文

网上医疗和医院网站建设山东省旅游网站建设

网上医疗和医院网站建设,山东省旅游网站建设,wordpress评论加入点赞,专业制作教学课件引言 Android插件化是一种将应用程序的功能模块化为独立的插件,并动态加载到主应用程序中的技术。通过插件化,开发者可以将应用程序的功能分解成独立的模块,每个模块可以作为一个插件单独开发、测试和维护,然后通过动态加载的方式集成到主应用程序中,实现功能的动态扩展和…引言 Android插件化是一种将应用程序的功能模块化为独立的插件,并动态加载到主应用程序中的技术。通过插件化,开发者可以将应用程序的功能分解成独立的模块,每个模块可以作为一个插件单独开发、测试和维护,然后通过动态加载的方式集成到主应用程序中,实现功能的动态扩展和更新。 Android插件化通常涉及到动态加载、组件化、插件生命周期管理、插件间通信等技术,开发者需要使用相关的框架和工具来实现插件化功能。插件化可以帮助开发者更好地管理应用程序的复杂性,提高开发效率,同时也能够实现应用程序的功能动态更新和扩展,为用户提供更好的体验。 1.startActivity源码解析 我们上篇提到,调用 startActivity 启动一个没有在 Manifest.xml 文件中注册的 Activity 会报异常,那么我们今天从 startActivity 开始分析为什么会报异常。 startActivity 的流程大概是上面所示,最后执行到 AMS.startActivity 后如果没有在 Manifest.xml 中注册,软件就会发生崩溃, 那么怎么样才能避免这样呢。其实非常简单,我们只要把我们未注册的 Activity 替换成我们已经在 Manifest.xml 注册不就行了吗。那么问题又来了,我们应该如何实现替换操作呢?说到替换,我们不得不借助动态代理的方式来实现了。 从上图可以看出,创建一个动态代理对象需要传递三个参数,下面介绍一下这些参数 ClassLoader loader: 类加载器 Class?[] interfaces: 需要监听的接口 InvocationHandler h: 监听的回调 说到这里,我们又延伸到另一个问题,我们应该监听哪一个接口呢?,其实从上面我们已经分析过了,我们应该要监听 AMS.startActivity 这一步,所以我们要监听的接口就是 IActivityTaskManager(9.0及以下是IActivityManager) 这个接口。接下来我们就对这个接口实现动态代理。 2.动态代理的实现 第一步: 我们可以通过 Class.forName() 得到 IActivityTaskManager 或者 IActivityManager 这个类,如下面代码所示: Class? mIActivityManagerClass; if (Build.VERSION.SDK_INT = Build.VERSION_CODES.Q) {mIActivityManagerClass = Class.forName("android.app.IActivityTaskManager"); } else {mIActivityManagerClass = Class.forName("android.app.IActivityManager"); } 有了类之后,我们可以创建动态代理对象了,但是 IActivityTaskManager 或者 IActivityManager 接口的方法那么多,我们没必要全部监听,我们只需要监听我们关注的 "startActivity" 这个方法就好了,如下代码所示: //创建动态代理 Object mActivityManagerProxy = Proxy.newProxyInstance(getClassLoader(),//类加载器new Class[]{mIActivityManagerClass},//要监听的回调接口new InvocationHandler() {//回调的监听@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if ("startActivity".equals(method.getName())) {//做自己的业务逻辑//换成可以通过AMS检测的Activity}//为了程序能够正确执行,我们需要系统的IActivityManager实例return method.invoke(需要系统的IActivityManager实例, args);} );从上述代码中可以看出,要使动态代理生效,我们还需要一个 IActivityManager,查阅源码 ActivityTaskManager(8.0~9.0以下看 ActivityManager,8.0以下看 ActivityManagerNative) 可发现: ActivityTaskManager.java:(Androdid10.0) /** @hide */ public static IActivityTaskManager getService() {return IActivityTaskManagerSingleton.get(); } ActivityManager.java:(Android 8.0 ~ Android9.0) /** * @hide */ public static IActivityManager getService() {return IActivityManagerSingleton.get(); } ActivityManagerNative.java:(Android 7.0及以下) /** * Retrieve the system's default/global activity manager. */ static public IActivityManager getDefault() {return gDefault.get(); }通过getService()或者getDefault()可以返回一个我们需要的对象实例,我们接下来可以反射来执行该方法来获取IActivityTaskManager或者IActivityManager实例对象。代码如下: //获取 ActivityManager 或 ActivityManagerNative 或 ActivityTaskManager Class? mActivityManagerClass; Method getActivityManagerMethod; if (Build.VERSION.SDK_INT = Build.VERSION_CODES.N_MR1) {mActivityManagerClass = Class.forName("android.app.ActivityManagerNative");getActivityManagerMethod = mActivityManagerClass.getDeclaredMethod("getDefault"); } else if (Build.VERSION.SDK_INT Build.VERSION_CODES.N_MR1 Build.VERSION.SDK_INT Build.VERSION_CODES.Q){mActivityManagerClass = Class.forName("android.app.ActivityManager");getActivityManagerMethod = mActivityManagerClass.getDeclaredMethod("getService"); } else {mActivityManagerClass = Class.forName("android.app.ActivityTaskManager");getActivityManagerMethod = mActivityManagerClass.getDeclaredMethod("getService"); } getActivityManagerMethod.setAccessible(true); //这个实例本质是 IActivityManager或者IActivityTaskManager final Object IActivityManager = getActivityManagerMethod.invoke(null);现在有了 IActivityTaskManager 或者 IActivityManager 实例对象我们就可以让程序继续能够执行下去了。 第二步: 既然我们自己创建了 IActivityTaskManager 或者 IActivityManager 的动态代理,我们就要把原来系统的 IActivityTaskManager 或者 IActivityManager 实例对象给替换掉。还是通过上面的 getService() 或者 getDefault() 方法入手,我们继续跟踪代码发现: ActivityManager 或 ActivityManagerNative 或 ActivityTaskManager 都有一个 Singleton 共同的属性,我们查看一下这个类的源码: public abstract class SingletonT {private T mInstance;protected abstract T create();public final T get() {synchronized (this) {if (mInstance == null) {mInstance = create();}return mInstance;}} } 里面的mInstance属性正好是IActivityTaskManager或者IActivityManager实例,所以我们直接替换掉mInstance值就可以了。代码如下: //获取 IActivityTaskManagerSingleton 或者 IActivityManagerSingleton 或者 gDefault 属性 Field mSingletonField; if (Build.VERSION.SDK_INT = Build.VERSION_CODES.N_MR1) {mSingletonField = mActivityManagerClass.getDeclaredField("gDefault"); } else if (Build.VERSION.SDK_INT Build.VERSION_CODES.N_MR1 Build.VERSION.SDK_INT Build.VERSION_CODES.Q){mSingletonField = mActivityManagerClass.getDeclaredField("IActivityManagerSingleton"); } else {mSingletonField = mActivityManagerClass.getDeclaredField("IActivityTaskManagerSingleton"); } mSingletonField.setAccessible(true); Object mSingleton = mSingletonField.get(null);//替换点 Class? mSingletonClass = Class.forName("android.util.Singleton"); Field mInstanceField = mSingletonClass.getDeclaredField("mInstance"); mInstanceField.setAccessible(true); //将我们创建的动态代理设置到 mInstance 属性当中 mInstanceField.set(mSingleton, mActivityManagerProxy);到这里我们的动态代理算是实现好了,完整的代码如下: private void hookAMSAction() throws Exception {//动态代理Class? mIActivityManagerClass;if (Build.VERSION.SDK_INT = Build.VERSION_CODES.Q) {mIActivityManagerClass = Class.forName("android.app.IActivityTaskManager");} else {mIActivityManagerClass = Class.forName("android.app.IActivityManager");}//获取 ActivityManager 或 ActivityManagerNative 或 ActivityTaskManagerClass? mActivityManagerClass;Method getActivityManagerMethod;if (Build.VERSION.SDK_INT = Build.VERSION_CODES.N_MR1) {mActivityManagerClass = Class.forName("android.app.ActivityManagerNative");getActivityManagerMethod = mActivityManagerClass.getDeclaredMethod("getDefault");} else if (Build.VERSION.SDK_INT Build.VERSION_CODES.N_MR1 Build.VERSION.SDK_INT Build.VERSION_CODES.Q){mActivityManagerClass = Class.forName("android.app.ActivityManager");getActivityManagerMethod = mActivityManagerClass.getDeclaredMethod("getService");} else {mActivityManagerClass = Class.forName("android.app.ActivityTaskManager");getActivityManagerMethod = mActivityMa
http://www.yutouwan.com/news/235356/

相关文章:

  • 做国外衣服的网站有哪些辽宁手机版建站系统信息
  • 自己做的网站 网站备案流程python做网站框架
  • 常德做网站专业公司赣州网站建设设计
  • 网站平台规划外贸管理网站模板
  • 济南软件网站建设威海房地产网站建设
  • 电商网站开发平台实验网站 目录访问
  • 网站建设需要什么语言昆明网站建设推广服务
  • 厦门+外贸公司做网站口腔门诊建设网站
  • 网站外链购买优秀的产品设计与分析
  • c2c网站页面设计特点河南一般建一个网站需要多少钱
  • 网站站点建设分为wordpress侧边栏加载js
  • asp.net 网站开发实例江苏财经职业技术学院会计系示范校建设专题网站
  • 站长工具权重查询站长之家ping检测
  • 呼和浩特网站建设公司高端网站建设wanghess
  • 云计算存储网站建设安全用wordpress框架建站
  • 阜阳市重点工程建设局网站wordpress数据库插件
  • 大连外贸建站做推广哪个网站好
  • 网站建设策划书 范文设计本室内设计师网
  • 免费旅行社网站模板金山文档数字变成e+10
  • 做网站赚钱流程工业设计大学排名
  • 电脑系统做的好的几个网站蚌埠做网站的公司
  • 什么是一学一做视频网站展示型网站可以做推广的吗
  • 网站怎么做二维码网站的可用性
  • 做网站排名收益ps做图下载网站有哪些
  • 深圳建一个网站要多少钱深圳网站建设高端设计
  • 常德网站建设制作可以自己做头像的网站
  • 网站建设中静态页面模板网站的设计思路范文
  • 如何加快百度收录网站百度关键词排名点击器
  • 天津建设工程信息网官网首页上海网站建设优化
  • 用discuz做商城网站2021最新免费的推广引流软件