实现Android插件化的核心技术简介(三):Android dynamic register activities
来源:互联网 发布:mac os 软件开发教程 编辑:程序博客网 时间:2024/06/05 23:54
实现Android插件化的核心技术(三):Android dynamic register activities
Android activities are monitored by Instrumentation.
Android activities受Instrumentation监控。
Each activity was started by Activity's startActivityForResult
. (1)
由Activity的
startActivityForResult
方法启动,通过instrumentation的execStartActivity
方法激活生命周期。
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { if (mParent == null) { Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( // Override entry 1 this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); ... }}
And instantiated by ActivityThread's performLaunchActivity
. (2)
在ActivityThread的
performLaunchActivity
方法中通过instrumentation的newActivity
方法实例化。
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ... Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( // Override entry 2 cl, component.getClassName(), r.intent); StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); r.intent.prepareToEnterProcess(); if (r.state != null) { r.state.setClassLoader(cl); } } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to instantiate activity " + component + ": " + e.toString(), e); } } ...}
To dynamic register activities, we register a stub activity in host's AndroidManifest.xml
to cheat (1) to manager the activity life circle for us. And then cheat (2) to create the plugin activity instance.
动态注册Activity,首先在宿主manifest中注册一个命名特殊的占坑activity来欺骗(1)以获得生命周期,再欺骗(2)来获得插件activity实例。
So all the things to do is wrapper a instrumentation and replace the host one.
要做的就是封装一个instrumentation,替换掉宿主的。
Fake code:
<!-- Stub Activities --><activity android:name=".A.0" android:launchMode="standard"/>
ActivityThread thread = currentActivityThread();Instrumentation base = thread.@mInstrumentation;Instrumentation wrapper = new InstrumentationWrapper(base);thread.@mInstrumentation = wrapper;class InstrumentationWrapper extends Instrumentation { public ActivityResult execStartActivity(..., Intent intent, ...) { fakeToStub(intent); base.execStartActivity(args); } @Override public Activity newActivity(ClassLoader cl, String className, Intent intent) { className = restoreToReal(intent, className); return base.newActivity(cl, className, intent); }}
- 实现Android插件化的核心技术简介(三):Android dynamic register activities
- 实现Android插件化的核心技术简介(三):Android dynamic register activities
- 实现Android插件化的核心技术简介(一):Android dynamic load classes
- 实现Android插件化的核心技术简介(二):Android dynamic load resources
- 实现Android插件化的核心技术简介(一):Android dynamic load classes
- 实现Android插件化的核心技术简介(二):Android dynamic load resources
- Android 插件化 核心技术
- android-Activities
- Android Activities
- android Activities
- Spring的核心技术(三)---Bean简介
- android之activities的生命周期
- android 应用基础(Activities)
- Android - Activities (几种状态的切换)(2015.12.1)
- Android Application Task Activities的关系
- Android Application Task Activities的关系
- Android Application Task Activities的关系
- Android Application Task Activities的关系
- 2.go开源cache2go项目笔记——项目介绍
- 实现Android插件化的核心技术简介(二):Android dynamic load resources
- Oracle中selec ... into ... from 和 insert into ... select...from区别
- 3.go开源cache2go项目笔记——cachetable文件
- Linux curl简介
- 实现Android插件化的核心技术简介(三):Android dynamic register activities
- leetcode Find K Pairs with Smallest Sums
- Codeforces Round #364 (Div. 1) 题解(待续)
- 网上相册(上传与下载)
- 5.go开源cache2go项目笔记——cache文件
- hdu 5747 Aaronson(贪心)
- Activity.finish() 、Activity.onDestory() and System.exit(0)
- Android Hot patch 技术:Dexposed-来自阿里手机淘宝部门的开源项目
- 在头文件中使用class进行前置声明