通过APP启动另一个App

最近一在面试,面试官曾问道这样一个问题,如何从一个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 */
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);}/** 通过包名获取要启动appactivtity(主界面的Activity) */private void doStartApplicationWithPackageName(String packagename){ // 通过包名获取此APP详细信息,包括Activitiesservicesversioncodename等等 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; // 这个就是我们要找的该APPLAUNCHERActivity[组织形式: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,通过包名和类名启动另外一个app中指定的activity,只知道包名启动另外一个App中的类(启动的就是主界面和直接启动另外一个APP一样,展开的是同一个界面)

注意:在指定启动另外一个App中的Activity时,要在目标APP对应的Activity中设置:exported="true,例:

<activity android:name=".SecondActivity"
    android:exported="true"/>

请尊重原创,参考:http://www.jianshu.com/p/42ae7066f8f3





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值