最近的开发中遇到一个问题,需要在一个App中开启另一个App进行一些操作,经过几天的研究有了一些进展,现在分享给大家。
第一种方法,使用Intent的隐式启动,通过设置Action去开启另一个App,如下例,先创建一个A项目,在A项目中的主Activity中的一个按钮的监听事件中写上下面的代码
Intent intent = new Intent();
intent.setAction("com.example.AIntent");
intent.putExtra("data", "我是A的值");
startActivity(intent);
之后,再新建一个项目B,首先需要在清单文件中做一些操作,即在从A跳转过来时要开启的B中的某一个Activity的注册中书写一个过滤器,写上如下代码,注意下面的name要与在A中设置的Action名字保持一致
<intent-filter>
<action android:name="com.example.AIntent"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
在B项目中的A要开启的Activity,使用下面的代码就可以接收到从A传过来的值
Intent intent = this.getIntent();
if(null != intent.getStringExtra("data")){
Log.v(TAG,intent.getStringExtra("data"));
}
第二种方法,使用ComponentName来实现,在A项目的点击事件中写上如下代码
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(B项目的包名, B项目要开启的Activity的包名);
intent.setComponent(cn);
intent.putExtra("data", "我是A的值");
startActivity(intent);
之后, 在B项目中的A要开启的Activity,使用下面的代码就可以接收到从A传过来的值
Intent intent = this.getIntent();
if(null != intent.getStringExtra("data")){
Log.v(TAG,intent.getStringExtra("data"));
}
第三种方法,使用的是系统的方法,在A项目的点击事件中写上如下代码
Intent intent = getPackageManager().getLaunchIntentForPackage(项目B的包名);
Bundle bundle = new Bundle();
bundle.putString("datas", data);
intent.putExtra("data", bundle);
startActivity(intent);
之后, 在B项目中的A要开启的Activity,使用下面的代码就可以接收到从A传过来的值
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("datas");
if (bundle != null) {
Log.v(TAG,bundle.getString("data"));
}
以上只是三种,本人将研究得出的方法,仅供参考,再次想要声明的是在开启另一个App的时候,是需要进行判断是否存在这个App,如下代码可以做个判断
PackageInfo packageInfo;
String packagename =要判断的包名;
try {
packageInfo = getPackageManager().getPackageInfo(packagename, 0);
} catch (NameNotFoundException e) {
packageInfo = null;
e.printStackTrace();
}
if (packageInfo == null) {
//使用上面方法任意一种去开启App
}else{
Toast.makeText(this, "没安装该应用,可以去下载", Toast.LENGTH_SHORT).show();
}