【Android 插件化】VirtualApp 源码分析 ( 启动应用源码分析 | HomePresenterImpl 启动应用方法 | VirtualCore 启动插件应用最终方法 )
文章目錄
- 一、啟動應用源碼分析
- 1、HomeActivity 啟動應用點擊方法
- 2、HomePresenterImpl 啟動應用方法
- 3、VirtualCore 啟動插件應用最終方法
一、啟動應用源碼分析
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;}@Overridepublic 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 {@Overridepublic 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 插件化】VirtualApp 源码分析 ( 启动应用源码分析 | HomePresenterImpl 启动应用方法 | VirtualCore 启动插件应用最终方法 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 插件化】Virtual
- 下一篇: 【错误记录】Android Studio