对于android中的跨进程间通信 大家肯定都有了解:
Activity 、AIDL 、BroadcastReceiver、ContentProvider 都可进行实现通信
而今天要说的是 从当前app 直接去启动另一个app 的某个界面
首先:最容易想到的是 广播
然而:亲测 接收广播的app在被kill后 会收不到广播
这时,可直接使用Activity进行启动:
1. 要判断应用是否存在:
/** * 根据包名判断应用是否存在 * @param context * @param packageName * @return */ private boolean isAvilible(Context context, String packageName){ final PackageManager packageManager = context.getPackageManager();//获取packagemanager List< PackageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息 List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名 //从pinfo中将包名字逐一取出,压入pName list中 if(pinfo != null){ for(int i = 0; i < pinfo.size(); i++){ String pn = pinfo.get(i).packageName; pName.add(pn); } } Log.e("有没有安装该程序",""+pName.contains(packageName)); return pName.contains(packageName);//判断pName中是否有目标程序的包名,有TRUE,没有FALSE }
2.判断后 进行界面的启动:
boolean b = isAvilible(model.getContext(),"myapp.first.myapplication2"); Log.e("是否已安装该程序",""+b); if (b){ Intent i = new Intent(); ComponentName cn = new ComponentName("myapp.first.myapplication", // 应用包名 "myapp.first.myapplication.ui.MainActivity"); // 要启动的activity 的全类名 i.setComponent(cn); // 给Initent设置组件 model.getContext().startActivityForResult(i, RESULT_OK); // 我的是mvp 所以上下文是这样的 需根据你自己的进行修改 }else { Log.e("没有安装该程序",""); }
//未安装,可跳转至market下载该程序 Uri uri = Uri.parse("market://details?id=com.skype.android.verizon");//id为包名 Intent it = new Intent(Intent.ACTION_VIEW, uri);model.getContext().startActivity(it);
//未安装时,也可弹个对话框 提示一下然后让用户去下载