0
点赞
收藏
分享

微信扫一扫

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )

文章目录

  • 一、目前的 API 现状
  • 二、安装应用源码分析

1、安装按钮执行的操作2、返回到 HomeActivity 执行的操作

一、目前的 API 现状

下图是 VirtualApp 官方给出的集成 VirtualApp 的步骤 , 这个 API 目前跑不通 , 应该是最新的商业版的使用 API ;

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )_原力计划

当前的开放源码是 2017 年底的源码 , 好在源码 , 可以从源码中查找 API ;

二、安装应用源码分析

1、安装按钮执行的操作

在安装应用界面中的 手机内存 界面中 , 选中要安装的应用 , 点击 " 安装 " 按钮 , 即可安装该应用到 VirtualApp 插件化引擎中 ;

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )_原力计划_02

到字符串资源中 , 找 " 安装 " 字符串 ;

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )_android_03

查找到在 io.virtualapp.home.ListAppFragment​ 页面中 , mInstallButton 就是要安装应用的按钮 , 其点击方法在后面的代码中 , 在后续的点击方法中 , 传入了一个 Lambda 表达式 , 获取了若干应用信息 AppInfoLite 对象 , 将该对象返回给 HomeActivity ;

这里 getActivity().setResult 返回到上一个界面 , 带着数据进入到上一个界面 , 也就是 HomeActivity 的

public class ListAppFragment extends VFragment<ListAppContract.ListAppPresenter> implements ListAppContract.ListAppView {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mAdapter.setSelectionListener(count -> {
mInstallButton.setEnabled(count > 0);
mInstallButton.setText(String.format(Locale.ENGLISH, getResources().getString(R.string.install_d), count));
});
mInstallButton.setOnClickListener(v -> {
Integer[] selectedIndices = mAdapter.getSelectedIndices();
ArrayList<AppInfoLite> dataList = new ArrayList<AppInfoLite>(selectedIndices.length);
for (int index : selectedIndices) {
AppInfo info = mAdapter.getItem(index);
dataList.add(new AppInfoLite(info.packageName, info.path, info.fastOpen));
Log.i("HSL", "packageName : " + info.packageName + " , path : " + info.path + " , fastOpen : " + info.fastOpen);
}
Intent data = new Intent();
data.putParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST, dataList);
getActivity().setResult(Activity.RESULT_OK, data);
getActivity().finish();
});
}
}

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )_android_04

使用

Log.i("HSL", "packageName : " + info.packageName + " , path : " + info.path + " , fastOpen : " + info.fastOpen);

代码 , 拦截一下数据 , 查看下传入的是什么参数 :

I/HSL: packageName : com.example.filepath , path : /storage/emulated/0/./app-debug.apk , fastOpen : false

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )_数据_05

在 adb shell 中查看 , 该应用在 SD 卡根目录 ;

【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )_数据_06

2、返回到 HomeActivity 执行的操作

使用的 MVP 模式 ;

返回的时候 , 获取到 AppInfoLite 集合 , 逐个遍历安装应用 ;

mPresenter.addApp(info);​ 实际上调用的是 io.virtualapp.home.HomePresenterImpl​ 类的 addApp() 方法

public class HomeActivity extends VActivity implements HomeContract.HomeView {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data != null) {
List<AppInfoLite> appList = data.getParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST);
if (appList != null) {
for (AppInfoLite info : appList) {
mPresenter.addApp(info);
}
}
}
}
}

举报

相关推荐

0 条评论