【Android 插件化】VirtualApp 源码分析 ( 启动应用源码分析 | HomePresenterImpl 启动应用方法 | VirtualCore 启动插件应用最终方法 )
文章目录
- 一、启动应用源码分析
- 1、HomeActivity 启动应用点击方法
- 2、HomePresenterImpl 启动应用方法
- 3、VirtualCore 启动插件应用最终方法
一、启动应用源码分析
1、HomeActivity 启动应用点击方法
在 io.virtualapp.home.HomeActivity
页面中 , 点击列表中的应用后 , 可以启动应用 ;
直接到 io.virtualapp.home.adapters.LaunchpadAdapter
适配器中查找点击事件源码 , 调用的是 private OnAppClickListener mAppClickListener;
成员变量的 onAppClick
方法 ;
该成员变量是通过 public void setAppClickListener(OnAppClickListener mAppClickListener)
方法注入的 ;
public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdapter.ViewHolder> {private LayoutInflater mInflater;private List<AppData> mList;private SparseIntArray mColorArray = new SparseIntArray();private OnAppClickListener mAppClickListener;public void setAppClickListener(OnAppClickListener mAppClickListener) {this.mAppClickListener = mAppClickListener;}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {holder.itemView.setBackgroundColor(holder.color);holder.itemView.setOnClickListener(v -> {if (mAppClickListener != null) {mAppClickListener.onAppClick(position, data);}});}
}
2、HomePresenterImpl 启动应用方法
调用 LaunchpadAdapter.setAppClickListener
方法注入应用启动点击事件 ,
public class HomeActivity extends VActivity implements HomeContract.HomeView {private static final String TAG = HomeActivity.class.getSimpleName();private HomeContract.HomePresenter mPresenter;private LaunchpadAdapter mLaunchpadAdapter;private void initLaunchpad() {mLaunchpadAdapter.setAppClickListener((pos, data) -> {if (!data.isLoading()) {if (data instanceof AddAppButton) {onAddAppButtonClick();}mLaunchpadAdapter.notifyItemChanged(pos);mPresenter.launchApp(data);}});}
}
应用启动 , 实际上调用的是 io.virtualapp.home.HomePresenterImpl
的 public void launchApp(AppData data)
方法 ;
class HomePresenterImpl implements HomeContract.HomePresenter {@Overridepublic void launchApp(AppData data) {try {if (data instanceof PackageAppData) {PackageAppData appData = (PackageAppData) data;Log.i("HSL", "PackageAppData : " + appData.toString());appData.isFirstOpen = false;LoadingActivity.launch(mActivity, appData.packageName, 0);} else if (data instanceof MultiplePackageAppData) {MultiplePackageAppData multipleData = (MultiplePackageAppData) data;Log.i("HSL", "MultiplePackageAppData : " + multipleData.toString());multipleData.isFirstOpen = false;LoadingActivity.launch(mActivity, multipleData.appInfo.packageName, ((MultiplePackageAppData) data).userId);}} catch (Throwable e) {e.printStackTrace();}}
}
拦截一下数据 , 上述两个位置打印出来的日志如下 :
I/HSL: PackageAppData : PackageAppData{packageName='kim.hsl.svg', name='SVG', icon=android.graphics.drawable.BitmapDrawable@8d312bf, fastOpen=false, isFirstOpen=false, isLoading=false}
3、VirtualCore 启动插件应用最终方法
最终启动应用的方法是 io.virtualapp.home.LoadingActivity
类中的 public static void launch(Context context, String packageName, int userId)
方法 ;
先从 VirtualCore
中获取启动的 Intent 1
, 然后启动一个 VActivity
, 创建 intent 2
, 将 从 VirtualCore
中获取启动的 Intent
放到 intent 2
中 ;
public class LoadingActivity extends VActivity {private static final String PKG_NAME_ARGUMENT = "MODEL_ARGUMENT";private static final String KEY_INTENT = "KEY_INTENT";private static final String KEY_USER = "KEY_USER";private PackageAppData appModel;public static void launch(Context context, String packageName, int userId) {Intent intent = VirtualCore.get().getLaunchIntent(packageName, userId);Log.i("HSL", "packageName : " + packageName + " , userId : " + userId);if (intent != null) {Intent loadingPageIntent = new Intent(context, LoadingActivity.class);loadingPageIntent.putExtra(PKG_NAME_ARGUMENT, packageName);loadingPageIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);loadingPageIntent.putExtra(KEY_INTENT, intent);loadingPageIntent.putExtra(KEY_USER, userId);context.startActivity(loadingPageIntent);}}
}
打印的数据 :
I/HSL: packageName : kim.hsl.svg , userId : 0
【Android 插件化】VirtualApp 源码分析 ( 启动应用源码分析 | HomePresenterImpl 启动应用方法 | VirtualCore 启动插件应用最终方法 )相关推荐
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 58同城Android端-最小插件化框架实战和原理分析
目录 背景 插件化需要了解的知识 2.1 类加载过程和类加载器 2.2 ClassLoader 的 findClass.findLibrary.findResource 2.3 DexClassLoa ...
- 滴滴开源Android插件化框架VirtualAPK原理分析
概述 滴滴出行公司的首个对外开源项目 - VirtualAPK.地址:github.com/didi/Virtua- 滴滴自行研发了这款插件化框架,功能全面.兼容性好,还能够适用于有耦合的业务插件,这 ...
- 滴滴插件化方案 VirtualApk 源码解析
本文已在我的公众号hongyangAndroid原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/75000580 本文 ...
- 《Android插件化技术——原理篇》
| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...
- android 禁止插件化,Android 插件化实现方式(Hook)
一.首先我们要找到Hook的点 1. 分析 我们先大概看下activity的启动流程(图片来自Android 插件化开发指南) image 当我们调用startActivity的时候,AMS对我们要启 ...
- 【Android 插件化】插件化原理 ( 类加载器 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 浅析Android插件化
前言 Android P preview版本中,已限制对@hide api的反射调用,具体的原理可以阅读Android P调用隐藏API限制原理这篇文章.由于最近团队分享也在分享插件化.热修复相关的东 ...
- Android插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
最新文章
- linux运维实战练习-2016年3月4日-3月19日课程作业(练习)安排
- 我怎样才能找到带有Mathematica的Waldo?
- SAP Spartacus 4.0 ng serve 之后,localhost 4200 会后面自动添上 electronics-spa 吗?
- c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...
- LintCode 207. 区间求和 II(线段树)
- BasicAuth和OAuth
- 输入两个整数,求他们相除的余数
- 计算所与北大往事回顾
- Linux安装网易云音乐
- mtk2503 GPS/操作系统/主板设计方式资料大全
- 关于全国大学生软件测试大赛总结与反思
- 百度统计热力图邀请码
- Python爬虫爬取Twitter视频、文章、图片
- Android一键锁屏,去除锁屏密码
- VaR方法(Value at Risk,简称VaR)[风险价值模型]
- 电商环境下中小企业客户关系管理系统设计
- MATLAB实现k近邻学习(Iris数据集)
- 创新链接未来,安全赋能发展——区块链技术网络安全应用创新大赛即将召开
- 同一种方法,同一句话,翻译成英语和泰语,差别为什么这么大?
- 用Google浏览器下载网页视频(包括优酷,土豆等网站视频)