前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )

【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )

作者头像
韩曙亮
发布2023-03-29 19:25:44
3180
发布2023-03-29 19:25:44
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、添加应用源码分析


1、LaunchpadAdapter 适配器

io.virtualapp.home.HomeActivity 中 , 点击已安装应用列表中的元素 , 启动安装的 APK 应用 ;

下图显示的 RecyclerView 列表如下 :

代码语言:javascript
复制
            <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 如下 :

代码语言:javascript
复制
private RecyclerView mLauncherView;

mLauncherView = (RecyclerView) findViewById(R.id.home_launcher);

设置的适配器如下 :

代码语言:javascript
复制
private LaunchpadAdapter mLaunchpadAdapter;
在这里插入图片描述
在这里插入图片描述

2、适配器添加元素

io.virtualapp.home.adapters.LaunchpadAdapter 中 , 列表数据源是 List<AppData> mList , 调用 public void add(AppData model) 添加元素 ;

代码语言:javascript
复制
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) 方法中 , 添加已安装的应用信息 ,

代码语言:javascript
复制
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) 方法中调用的 , 应用安装完毕后 , 会调用添加应用到列表中的方法 ;

代码语言:javascript
复制
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 ;

代码语言:javascript
复制
public class PackageAppData implements AppData {
    public String packageName;
    public String name;
    public Drawable icon;
    public boolean fastOpen;
    public boolean isFirstOpen;
    public boolean isLoading;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、添加应用源码分析
    • 1、LaunchpadAdapter 适配器
      • 2、适配器添加元素
        • 3、PackageAppData 元素
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档