【Android 插件化】VirtualApp 源码分析 ( 启动应用源码分析 | HomePresenterImpl 启动应用方法 | VirtualCore 启动插件应用最终方法 )
2023-06-13 09:17:59 时间
文章目录
一、启动应用源码分析
1、HomeActivity 启动应用点击方法
在 io.virtualapp.home.HomeActivity
页面中 , 点击列表中的应用后 , 可以启动应用 ;
直接到 io.virtualapp.home.adapters.LaunchpadAdapter
适配器中查找点击事件源码 , 调用的是 private OnAppClickListener mAppClickListener;
成员变量的 onAppClick
方法 ;
该成员变量是通过 public void setAppClickListener(OnAppClickListener mAppClickListener)
方法注入的 ;
public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdapter.ViewHolder> {
private LayoutInflater mInflater;
private List<AppData> mList;
private SparseIntArray mColorArray = new SparseIntArray();
private OnAppClickListener mAppClickListener;
public void setAppClickListener(OnAppClickListener mAppClickListener) {
this.mAppClickListener = mAppClickListener;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setBackgroundColor(holder.color);
holder.itemView.setOnClickListener(v -> {
if (mAppClickListener != null) {
mAppClickListener.onAppClick(position, data);
}
});
}
}
2、HomePresenterImpl 启动应用方法
调用 LaunchpadAdapter.setAppClickListener
方法注入应用启动点击事件 ,
public class HomeActivity extends VActivity implements HomeContract.HomeView {
private static final String TAG = HomeActivity.class.getSimpleName();
private HomeContract.HomePresenter mPresenter;
private LaunchpadAdapter mLaunchpadAdapter;
private void initLaunchpad() {
mLaunchpadAdapter.setAppClickListener((pos, data) -> {
if (!data.isLoading()) {
if (data instanceof AddAppButton) {
onAddAppButtonClick();
}
mLaunchpadAdapter.notifyItemChanged(pos);
mPresenter.launchApp(data);
}
});
}
}
应用启动 , 实际上调用的是 io.virtualapp.home.HomePresenterImpl
的 public void launchApp(AppData data)
方法 ;
class HomePresenterImpl implements HomeContract.HomePresenter {
@Override
public void launchApp(AppData data) {
try {
if (data instanceof PackageAppData) {
PackageAppData appData = (PackageAppData) data;
Log.i("HSL", "PackageAppData : " + appData.toString());
appData.isFirstOpen = false;
LoadingActivity.launch(mActivity, appData.packageName, 0);
} else if (data instanceof MultiplePackageAppData) {
MultiplePackageAppData multipleData = (MultiplePackageAppData) data;
Log.i("HSL", "MultiplePackageAppData : " + multipleData.toString());
multipleData.isFirstOpen = false;
LoadingActivity.launch(mActivity, multipleData.appInfo.packageName, ((MultiplePackageAppData) data).userId);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
拦截一下数据 , 上述两个位置打印出来的日志如下 :
I/HSL: PackageAppData : PackageAppData{packageName='kim.hsl.svg', name='SVG', icon=android.graphics.drawable.BitmapDrawable@8d312bf, fastOpen=false, isFirstOpen=false, isLoading=false}
3、VirtualCore 启动插件应用最终方法
最终启动应用的方法是 io.virtualapp.home.LoadingActivity
类中的 public static void launch(Context context, String packageName, int userId)
方法 ;
先从 VirtualCore
中获取启动的 Intent 1
, 然后启动一个 VActivity
, 创建 intent 2
, 将 从 VirtualCore
中获取启动的 Intent
放到 intent 2
中 ;
public class LoadingActivity extends VActivity {
private static final String PKG_NAME_ARGUMENT = "MODEL_ARGUMENT";
private static final String KEY_INTENT = "KEY_INTENT";
private static final String KEY_USER = "KEY_USER";
private PackageAppData appModel;
public static void launch(Context context, String packageName, int userId) {
Intent intent = VirtualCore.get().getLaunchIntent(packageName, userId);
Log.i("HSL", "packageName : " + packageName + " , userId : " + userId);
if (intent != null) {
Intent loadingPageIntent = new Intent(context, LoadingActivity.class);
loadingPageIntent.putExtra(PKG_NAME_ARGUMENT, packageName);
loadingPageIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
loadingPageIntent.putExtra(KEY_INTENT, intent);
loadingPageIntent.putExtra(KEY_USER, userId);
context.startActivity(loadingPageIntent);
}
}
}
打印的数据 :
I/HSL: packageName : kim.hsl.svg , userId : 0
相关文章
- android activity自动跳转,Android activity跳转之finish()方法的作用
- android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」
- android onresume方法,Android onActivityResult()和onResume()的执行顺序
- Android抽象布局——include、merge 、ViewStub[通俗易懂]
- android scaleanimation动画,Android 动画之ScaleAnimation应用详解「建议收藏」
- Android ContentProvider_1 使用方法
- android进程间通信的方式_Android进程注入
- 【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
- 【错误记录】Flutter / Android 报错 ( AAPT: error: attribute android:requestLegacyExternalStorage not found )
- 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task
- 【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
- android 签名详解手机开发
- android最新更新方法详解手机开发
- Android应用开发SharedPreferences存储数据的使用方法
- android版本检测Android程序的版本检测与更新实现介绍
- Android源码学习之工厂方法模式应用及优势介绍
- android之计时器(Chronometer)的使用以及常用的方法
- 基于Android中手势交互的实现方法
- Android自定义View设定到FrameLayout布局中实现多组件显示的方法分享
- Android中应用界面主题Theme使用方法和页面定时跳转应用
- android轻松管理安卓应用中的log日志发布应用时log日志全部去掉的方法
- Android中检查、监听电量和充电状态的方法
- Android实现授权访问网页的方法
- Android实现上传文件功能的方法
- Android实现将已发送的短信写入短信数据库的方法