文章目录

  • 一、启动应用源码分析
    • 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.HomePresenterImplpublic 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 启动插件应用最终方法 )相关推荐

  1. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  2. 58同城Android端-最小插件化框架实战和原理分析

    目录 背景 插件化需要了解的知识 2.1 类加载过程和类加载器 2.2 ClassLoader 的 findClass.findLibrary.findResource 2.3 DexClassLoa ...

  3. 滴滴开源Android插件化框架VirtualAPK原理分析

    概述 滴滴出行公司的首个对外开源项目 - VirtualAPK.地址:github.com/didi/Virtua- 滴滴自行研发了这款插件化框架,功能全面.兼容性好,还能够适用于有耦合的业务插件,这 ...

  4. 滴滴插件化方案 VirtualApk 源码解析

    本文已在我的公众号hongyangAndroid原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/75000580 本文 ...

  5. 《Android插件化技术——原理篇》

    | 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...

  6. android 禁止插件化,Android 插件化实现方式(Hook)

    一.首先我们要找到Hook的点 1. 分析 我们先大概看下activity的启动流程(图片来自Android 插件化开发指南) image 当我们调用startActivity的时候,AMS对我们要启 ...

  7. 【Android 插件化】插件化原理 ( 类加载器 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 浅析Android插件化

    前言 Android P preview版本中,已限制对@hide api的反射调用,具体的原理可以阅读Android P调用隐藏API限制原理这篇文章.由于最近团队分享也在分享插件化.热修复相关的东 ...

  9. Android插件化原理解析——ContentProvider的插件化

    目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...

最新文章

  1. linux运维实战练习-2016年3月4日-3月19日课程作业(练习)安排
  2. 我怎样才能找到带有Mathematica的Waldo?
  3. SAP Spartacus 4.0 ng serve 之后,localhost 4200 会后面自动添上 electronics-spa 吗?
  4. c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...
  5. LintCode 207. 区间求和 II(线段树)
  6. BasicAuth和OAuth
  7. 输入两个整数,求他们相除的余数
  8. 计算所与北大往事回顾
  9. Linux安装网易云音乐
  10. mtk2503 GPS/操作系统/主板设计方式资料大全
  11. 关于全国大学生软件测试大赛总结与反思
  12. 百度统计热力图邀请码
  13. Python爬虫爬取Twitter视频、文章、图片
  14. Android一键锁屏,去除锁屏密码
  15. VaR方法(Value at Risk,简称VaR)[风险价值模型]
  16. 电商环境下中小企业客户关系管理系统设计
  17. MATLAB实现k近邻学习(Iris数据集)
  18. 创新链接未来,安全赋能发展——区块链技术网络安全应用创新大赛即将召开
  19. 同一种方法,同一句话,翻译成英语和泰语,差别为什么这么大?
  20. 用Google浏览器下载网页视频(包括优酷,土豆等网站视频)

热门文章

  1. 转载-ubuntu搭建Git 服务器
  2. Git现实(一个)版本控制概述
  3. asp.net 利用多表联合查询进行汇总统计
  4. git submodule获取子模块
  5. redhat6.4中手动创建oracle11g数据库
  6. 有时间看下这个,分布式缓存,提高并发的
  7. bzoj 2870 最长道路tree——边分治
  8. 一、静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。...
  9. 【实验报告】四恶意代码实验
  10. 字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理