程序员社区

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

文章目录

  • 一、目前的 API 现状
  • 二、安装应用源码分析
    • 1、安装按钮执行的操作
    • 2、返回到 HomeActivity 执行的操作

一、目前的 API 现状


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

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

二、安装应用源码分析


1、安装按钮执行的操作

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

在这里插入图片描述

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

在这里插入图片描述

查找到在 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();
        });
	}
}

在这里插入图片描述

使用

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

在这里插入图片描述

在 adb shell 中查看 , 该应用在 SD 卡根目录 ;
在这里插入图片描述

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) 打赏
未经允许不得转载:IDEA激活码 » 【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区