Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )(代
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )(代相关的知识,希望对你有一定的参考价值。
一、添加应用源码分析
1、LaunchpadAdapter 适配器
在 io.virtualapp.home.HomeActivity
中 , 点击已安装应用列表中的元素 , 启动安装的 APK 应用 ;
下图显示的 RecyclerView 列表如下 :
<android.support.v7.widget.RecyclerView
android:id="@+id/home_launcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:scrollbars="vertical"
tools:listitem="@layout/item_launcher_app" />
在 HomeActivity 中定义的 RecyclerView 如下 :
private RecyclerView mLauncherView;
mLauncherView = (RecyclerView) findViewById(R.id.home_launcher);
设置的适配器如下 :
private LaunchpadAdapter mLaunchpadAdapter;
2、适配器添加元素
在 io.virtualapp.home.adapters.LaunchpadAdapter
中 , 列表数据源是 List<AppData> mList
, 调用 public void add(AppData model)
添加元素 ;
public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdapter.ViewHolder> {
private List<AppData> mList;
// 添加元素
public void add(AppData model) {
int insertPos = mList.size() - 1;
mList.add(insertPos, model);
notifyItemInserted(insertPos);
}
}
在 HomeActivity 的 public void addAppToLauncher(AppData model)
方法中 , 添加已安装的应用信息 ,
public class HomeActivity extends VActivity implements HomeContract.HomeView {
@Override
public void addAppToLauncher(AppData model) {
List<AppData> dataList = mLaunchpadAdapter.getList();
boolean replaced = false;
for (int i = 0; i < dataList.size(); i++) {
AppData data = dataList.get(i);
if (data instanceof EmptyAppData) {
mLaunchpadAdapter.replace(i, model);
replaced = true;
break;
}
}
if (!replaced) {
mLaunchpadAdapter.add(model);
mLauncherView.smoothScrollToPosition(mLaunchpadAdapter.getItemCount() - 1);
}
}
}
在 HomeActivity 中声明的 public void addAppToLauncher(AppData model)
方法 , 是在 public void addApp(AppInfoLite info)
方法中调用的 , 应用安装完毕后 , 会调用添加应用到列表中的方法 ;
class HomePresenterImpl implements HomeContract.HomePresenter {
@Override
public void addApp(AppInfoLite info) {
class AddResult {
private PackageAppData appData;
private int userId;
private boolean justEnableHidden;
}
AddResult addResult = new AddResult();
VUiKit.defer().when(() -> {
// 获取安装的应用信息 , 该应用之前是否安装过
// 这里应该是判断 克隆应用 / SD 卡 APK 文件
}).then((res) -> {
addResult.appData = PackageAppDataStorage.get().acquire(info.packageName);
}).done(res -> {
// 是否有多个版本
boolean multipleVersion = addResult.justEnableHidden && addResult.userId != 0;
if (!multipleVersion) {
PackageAppData data = addResult.appData;
data.isLoading = true;
// 添加应用
mView.addAppToLauncher(data);
handleOptApp(data, info.packageName, true);
} else {
MultiplePackageAppData data = new MultiplePackageAppData(addResult.appData, addResult.userId);
data.isLoading = true;
// 添加应用
mView.addAppToLauncher(data);
handleOptApp(data, info.packageName, false);
}
});
}
}
3、PackageAppData 元素
上述 LaunchpadAdapter
列表适配器的数据源 List<AppData> dataList
, 中的元素类型是 io.virtualapp.home.modelsPackageAppData
;
public class PackageAppData implements AppData {
public String packageName;
public String name;
public Drawable icon;
public boolean fastOpen;
public boolean isFirstOpen;
public boolean isLoading;
}
以上是关于Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )(代的主要内容,如果未能解决你的问题,请参考以下文章
Android 插件化VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )
Android 插件化VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )
Android 插件化VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )
Android 插件化VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )
Android 插件化VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(代码片
Android 插件化VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(代码片