文章目录
一、添加应用源码分析
1、LaunchpadAdapter 适配器
2、适配器添加元素
3、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; }