经常在一些应用中看到“相关推荐”这种功能,那么具体如何实现,这里给出几种方案:
Android
Component方式(显示调用)
被调用程序需要做如下配置:
<activity
android:name="com.freesoft.androiddemo.TestActivity"
android:label="@string/app_name"
android:exported="true">
</activity>
如果是非启动页面还需要加上:
android:exported=”true”
调用程序代码如下:
try {
// Component方式启动
Intent intent = new Intent(Intent.ACTION_MAIN);
ComponentName componentName = new ComponentName(
"com.freesoft.androiddemo",
"com.freesoft.androiddemo.TestActivity");
intent.setComponent(componentName);
startActivity(intent);
} catch (ActivityNotFoundException e) {
// TODO: 下载客户端
Log.v("MainActivity", "程序未安装");
}
Action Name方式(隐式调用)
被调用程序需要如下配置:
<activity
android:name="com.freesoft.androiddemo.TestActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.freesoft.inappinteraction" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
注意:
- 所有需要能够被隐式启动的Activity都必须在intent-filter中设置category为DEFAULT。
- 不能仅靠category来启动程序 。例如这样的配置:
<activity
android:name="com.freesoft.androiddemo.TestActivity"
android:label="@string/app_name">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.freesoft.inappinteraction"/>
</intent-filter>
</activity>
调用程序的代码如下:
try {
Intent intent = new Intent();
intent.setAction("com.freesoft.inappinteraction");
startActivity(intent);
} catch (ActivityNotFoundException e) {
// TODO: 下载客户端
Log.v("MainActivity", "程序未安装");
}
Action Data方式(隐式启动)
被调用程序需要如下配置:
<activity
android:name="com.freesoft.androiddemo.TestActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.freesoft.inappinteraction"/>
<category android:name="android.intent.category.DEFAULT"/>
<!--
Data的语法:
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
-->
<data android:scheme="iai" android:host="www.freesoft.com" />
</intent-filter>
</activity>
调用程序代码如下:
// Action方式启动
Intent intent = new Intent();
intent.setAction("com.freesoft.inappinteraction");
// Uri的格式:scheme://host:port/path or pathPrefix or pathPattern
intent.setData(Uri.parse("iai://www.freesoft.com"));
startActivity(intent);
} catch (ActivityNotFoundException e) {
// TODO: 下载客户端
Log.v("MainActivity", "程序未安装");
}
如何传递参数
需要传递参数的时候这样:
try {
// Action方式启动
Intent intent = new Intent();
intent.setAction("com.freesoft.inappinteraction");
// Uri的格式:scheme://host:port/path or pathPrefix or pathPattern
intent.setData(Uri.parse("iai://www.freesoft.com"));
intent.putExtra("isPrivate", true);
intent.putExtra("source", "www.freesoft.com");
startActivity(intent);
} catch (ActivityNotFoundException e) {
// TODO: 下载客户端
Log.v("MainActivity", "程序未安装");
}
iOS平台
被调用程序设置:
还可以判断调用程序:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if ([sourceApplication isEqualToString:@"www.freesoft.com.Invoker"]) {
//
}
return YES;
}
而调用程序的代码如下:
NSURL *url = [[NSURL alloc] initWithString:@"iai://www.freesoft.com/iai?key=value"];
[[UIApplication sharedApplication] openURL:url];
ok,通过以上步骤,即可完成程序间的互相调用。