逻辑分析:
如果Bapp安装了,则拉起,并在指定的activity里面做特别处理
如果Bapp没有安装,则跳转到Bapp的应用市场
包名拉起
优点:简单易上手
缺点:会暴露包名,和Bapp的activity全名
- 首先修改B的配置文件AndroidManifest.xml,针对拉起的指定的Activity,加上下面这句话
android:exported="true"
- 在Aapp里面编写代码
String packname = "com.example.bapp"; // Bapp的包名
String activity = "com.example.bapp.BappActivity"; // Bapp指定拉起的activity的全名
public void openBapp() {
Intent intent;
PackageManager packageManager = getPackageManager();
if (checkPackInfo(packname)) {
intent = packageManager.getLaunchIntentForPackage(packname);
ComponentName component = new ComponentName(packname, activity);
intent.setComponent(component);
intent.putExtra("fromOtherApp" , true);
startActivity(intent);
} else {
Uri uri = Uri.parse("market://details?id=" + packname);
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
private boolean checkPackInfo(String packname) {
PackageInfo packageInfo = null;
try {
packageInfo = getPackageManager().getPackageInfo(packname, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return packageInfo != null;
}
- 在Bapp的指定activity里面做处理,可以放在onResume里面,这样在拉起Bapp的时候一定会调用
@Override
public void onResume() {
Intent intent = getIntent();
if (null != intent){
if(intent.getBooleanExtra("fromOtherApp", false)){
// 在这里写具体处理内容
}
}
}
URI拉起
优点:未暴露Bapp的包名和activity的全名(下面的例子是为了拉起应用市场才暴露包名的,单纯拉起Bapp并未用到包名)
缺点:比较复杂,需要在配置文件里定义死了host,path,scheme
- 修改B的配置文件AndroidManifest.xml,针对拉起的指定的Activity,加上下面这句话
android:exported="true"
- 修改B的配置文件AndroidManifest.xml,针对拉起的指定的Activity,加上下面这个标签
scheme最好定义成独一无二的,原因如下:
Aapp唤醒的时候不会询问用哪个APP打开,会直接打开Bapp
举个例子:
如果定义成https,那么Aapp在唤醒的时候,会弹出询问框,询问用哪个app打开
询问选项包括:Bapp,浏览器
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="bapp.example.com"
android:path="/bapphome/"
android:scheme="open_bapp" />
</intent-filter>
- 在Bapp的指定activity里面做处理,可以放在onResume里面,这样在拉起Bapp的时候一定会调用
// 配置文件里定义的内容
public static final String SCANNER_INTENT_SCHEME = "open_bapp";
public static final String SCANNER_INTENT_HOST = "bapp.example.com";
public static final String SCANNER_INTENT_PATH = "/bapphome/";
@Override
public void onResume() {
Intent intent = getIntent();
if (null != intent){
Uri uriData = intent.getData();
if (uriData != null &&
SCANNER_INTENT_SCHEME.equalsIgnoreCase(uriData.getScheme()) &&
SCANNER_INTENT_HOST.equalsIgnoreCase(uriData.getHost()) &&
SCANNER_INTENT_PATH .equalsIgnoreCase(uriData.getPath())) {
// 在这里写具体处理内容
}
}
}
- 在Aapp里面编写代码
String packname = "com.example.bapp";
public void openBapp() {
Intent intent;
if (checkPackInfo(packname)) {
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("open_bapp://bapp.example.com/bapphome/"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 这句话一定要写,否则会在Aapp里面直接显示Bapp的内容,不会拉起新的Bapp
startActivity(intent);
} else {
Uri uri = Uri.parse("market://details?id=" + packname);
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
private boolean checkPackInfo(String packname) {
PackageInfo packageInfo = null;
try {
packageInfo = getPackageManager().getPackageInfo(packname, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return packageInfo != null;
}