Android实现免安装APK插件(三)

3、 Activity生命周期怎么实现

虽然startActivity正常了,但是这不是要启动的Activity,岂不是做了无用功。然而事情往往没那么简单,既然系统服务那关已经过了,我们得自己做点事情了。Activity的创建及生命周期都是在自己进程中完成的,所以ActivityThread这个类似乎可以帮我们做事情。
注意到ActivityThread中mH完成了Activity的创建和生命周期的事件处理,所以我们只需要在mH处理事件前,把壳Activity又替换为要启动的Activity不就可以了。所以这又涉及到消息拦截了,我们来看下handleMessage如何拦截:

    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
}

正常情况mCallback为null,我们只需要设置一个mCallback就可以拦截消息,把msg中intent取出来替换为新的intent,接着交给handleMessage继续处理就可以了。如下:

    public void invokeActivityThread() {
        try {
            Class clazz = Class.forName("android.app.ActivityThread");
            Method method = clazz.getMethod("currentActivityThread");
            Object object = method.invoke(null);
            Field field = clazz.getDeclaredField("mH");
            field.setAccessible(true);
            Object handler = field.get(object);
            Class handlerClass = Class.forName("android.os.Handler");
            Field callback = handlerClass.getDeclaredField("mCallback");
            callback.setAccessible(true);
            callback.set(handler, mCallBack);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

    }

    private Handler.Callback mCallBack = new Handler.Callback() {
        private static final int LAUNCH_ACTIVITY = 100;

        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == LAUNCH_ACTIVITY) {
                Log.i(TAG, "LAUNCH_ACTIVITY");
                try {
                    Class clazz = Class.forName("android.app.ActivityThread$ActivityClientRecord");
                    Field field = clazz.getDeclaredField("intent");
                    field.setAccessible(true);
                    Intent orig = (Intent) field.get(msg.obj);
                    String className = orig.getComponent().getClassName();
                    Log.i(TAG, "className = " + className);
                    Log.i(TAG, "mForkActivity.getName() = " + mForkActivity.getName());
                    if (TextUtils.equals(className, mForkActivity.getName())) {
                        String plugActivity = orig.getStringExtra(LoadDexUtils.EXTRA_PLUG_ACTIVITY);
                        Log.i(TAG, "plugActivity = " + plugActivity);
                        Intent intent = new Intent();
                        ComponentName componentName = new ComponentName(LoadDexUtils.PLUG_PACKAGE_NAME, plugActivity);
                        intent.setComponent(componentName);
                        field.set(msg.obj, intent);
                    }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
    };

由于我们只是替换了intent中的component内容,系统照样会帮助我们完成Activity的生命周期,到这里有些大功告成的感觉,但是一运行,马上就是资源报错,宿主可不知道还有插件的资源存在。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android SDK是一个开发工具包,用于创建Android应用程序。它提供了丰富的API和工具,帮助开发者构建高质量的Android应用程序。 Android SDK不需要安装,可以直接使用。它是一个独立的开发环境,可以在不同的操作系统上运行,如Windows、Mac和Linux。开发者只需下载并解压缩Android SDK包,然后设置环境变量,即可开始使用。 Android SDK包含了一些重要的组件,如Android平台工具、Android SDK构建工具和Android系统镜像。在设置环境变量后,开发者可以通过命令行界面或图形化界面来执行各种操作,如创建新的项目、编译和调试应用程序。 使用Android SDK进行开发有以下几个优点: 1. 多平台支持:Android SDK可以在不同的操作系统上运行,方便开发者使用自己熟悉的操作系统进行开发。 2. 完整的开发环境:Android SDK提供了一套完整的开发环境,包括编译器、调试器和模拟器等工具,帮助开发者高效地开发和测试应用程序。 3. 丰富的API和文档:Android SDK提供了丰富的API和详细的文档,开发者可以轻松地使用各种功能和服务,如界面设计、数据存储和网络通信等。 4. 社区支持:Android SDK有一个庞大的开发者社区,开发者可以在其中分享经验、解决问题和交流思想,获得帮助和支持。 总而言之,Android SDK是一个功能强大且易于使用的开发工具包,可以帮助开发者快速构建优秀的Android应用程序。它的安装特性让开发者能够更加方便地使用和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值