最近一在面试,面试官曾问道这样一个问题,如何从一个APP启动另外一个App?
关于这个问题,以前工作中并没有遇到过,只是闲暇的时候自己写过小demo,不过由于时间太久了,也没有记录,差不多都忘了,今天特地补上,参考了网上一些大神的例子,这里总结一下,记录下来,下面直接上代码了:
目标App:(被启动的App):
这里没什么说的就是一个MainActivity和SeaondActivity
第一个App:
private Button mButton1,mButton2; private String packname = "com.example.wls.startupapp"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton1 = (Button) findViewById(R.id.btn1); mButton2 = (Button) findViewById(R.id.btn2); mButton1.setOnClickListener(this); mButton2.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn1: startApp(); break; case R.id.btn2: startUpActivity(); // doStartApplicationWithPackageName(packname); break; } }代码中有打方法都有注释,通过包名启动另外一个App,通过包名和类名启动另外一个app中指定的activity,只知道包名启动另外一个App中的类(启动的就是主界面和直接启动另外一个APP一样,展开的是同一个界面)/** 启动指定app */ private void startApp(){ //获得已安装引用程序信息 PackageManager packageManager = getPackageManager(); /** 不知道包名的时候,可以通过该方法遍历出手机上安装的所有程序的包名 */ List<PackageInfo> list = packageManager.getInstalledPackages(0); for(int i = 0; i < list.size(); i++){ Log.d("wls", "startApp: " + list.get(i).packageName); } if(checkPackInfo(packname)){ // 通过包名获取要跳转的app,创建intent对象 Intent intent = packageManager.getLaunchIntentForPackage(packname); startActivity(intent); }else { Toast.makeText(this,"没有安装该App",Toast.LENGTH_LONG).show(); } }/** 判断包名是否存在 */private boolean checkPackInfo(String packname){ //获取指定应用的PackageInfo信息 PackageInfo packageInfo = null; try { packageInfo = getPackageManager().getPackageInfo(packname,0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return packageInfo != null;}/** 启动指定Activity(已知类名) */private void startUpActivity(){ Intent intent = new Intent(); ComponentName componentName = new ComponentName(packname,packname + ".SecondActivity"); intent.setComponent(componentName); startActivity(intent);}/** 通过包名获取要启动app的activtity(主界面的Activity) */private void doStartApplicationWithPackageName(String packagename){ // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等 PackageInfo packageinfo = null; try { packageinfo = getPackageManager().getPackageInfo(packagename, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } if (packageinfo == null) { return; } // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(packageinfo.packageName); // 通过getPackageManager()的queryIntentActivities方法遍历 List<ResolveInfo> resolveinfoList = getPackageManager() .queryIntentActivities(resolveIntent, 0); ResolveInfo resolveinfo = resolveinfoList.iterator().next(); if (resolveinfo != null) { // packagename = 参数packname String packageName = resolveinfo.activityInfo.packageName; // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname] String className = resolveinfo.activityInfo.name; // LAUNCHER Intent Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); // 设置ComponentName参数1:packagename参数2:MainActivity路径 ComponentName cn = new ComponentName(packageName, className); intent.setComponent(cn); startActivity(intent); }}
注意:在指定启动另外一个App中的Activity时,要在目标APP对应的Activity中设置:exported="true,例:
<activity android:name=".SecondActivity" android:exported="true"/>
请尊重原创,参考:http://www.jianshu.com/p/42ae7066f8f3