当前分享模块使用 ShareProxyActivity 作为透明代理 Activity 来统一处理所有平台的分享回调:
业务层调用 shareService.share(activity, content, callback)
↓
自动启动 ShareProxyActivity(透明)
↓
ShareProxyActivity.onCreate() 调用 shareService.shareManual()
↓
执行实际分享(友盟SDK)
↓
用户在第三方应用完成分享
↓
第三方应用回调 → ShareProxyActivity.onActivityResult()
↓
ShareProxyActivity 调用 shareService.onActivityResult()
↓
处理回调并传递给业务层
↓
ShareProxyActivity 自动关闭
ShareProxyActivity:
onActivityResult 回调share() 方法:
ShareProxyActivityshareManual() 避免递归调用shareManual() 方法:
ShareProxyActivity 内部调用onActivityResult() 方法:
ShareProxyActivity 调用✅ 业务层透明:业务层不需要处理 onActivityResult
✅ 统一处理:所有平台的回调都统一在 ShareProxyActivity 中处理
✅ 完全封装:实现细节完全封装在模块内部
❌ 依赖 Activity:必须启动一个透明的 Activity
❌ 生命周期复杂:需要管理 Activity 的生命周期和超时
❌ 增加 Activity 栈:每次分享都会启动新的 Activity
❌ 灵活性不足:无法让业务层自行处理回调
onActivityResult业务层调用 shareService.share(activity, content, callback)
↓
直接执行分享(友盟SDK)
↓
用户在第三方应用完成分享
↓
第三方应用回调 → 业务层 Activity.onActivityResult()
↓
业务层调用 shareService.onActivityResult()
↓
处理回调并传递给业务层
所有分享都通过一个统一的 share() 方法:
interface ShareService {
/**
* 统一分享方法(推荐使用)
*
* 如果 ShareContent.platform 已指定,则直接分享到该平台
* 如果 ShareContent.platform 为 null,则显示分享弹窗让用户选择平台
*
* 注意:业务层需要在 Activity.onActivityResult() 中调用 shareService.onActivityResult()
*
* @param activity Activity上下文
* @param content 分享内容
* @param callback 分享结果回调
*/
fun share(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
/**
* 处理分享回调(必须在 Activity.onActivityResult() 中调用)
*
* 业务层必须在 Activity.onActivityResult() 中调用此方法,以接收分享结果
*
* @param activity Activity上下文
* @param requestCode 请求码
* @param resultCode 结果码
* @param data Intent数据
*/
fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?)
}
保留各平台的具体分享方法,但都改为直接调用,不通过代理 Activity:
interface ShareService {
// 统一分享方法(推荐)
fun share(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
// 各平台分享方法(可选,向后兼容)
fun shareToWeChat(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToWeChatMoments(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToQQ(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToQZone(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToWeibo(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToDouyin(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToXiaohongshu(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToKuaishou(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
fun shareToSystem(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
// 显示分享弹窗
fun showShareDialog(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
// 必须调用:处理分享回调
fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?)
}
interface ShareService {
// 移除 shareManual() 方法(不再需要)
// 移除:fun shareManual(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit)
// share() 方法改为直接执行,不启动 ShareProxyActivity
fun share(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit) {
// 如果指定了平台,直接分享到该平台
if (content.platform != null) {
shareToPlatform(activity, content, content.platform, callback)
} else {
// 否则显示分享弹窗
showShareDialog(activity, content, callback)
}
}
}
class ShareServiceImpl : ShareService {
// 存储回调(用于 onActivityResult 时查找)
private val callbacks = mutableMapOf<Int, (ShareResponse) -> Unit>()
private var requestCodeCounter = 1000
override fun share(activity: Activity, content: ShareContent, callback: (ShareResponse) -> Unit) {
// 不再启动 ShareProxyActivity,直接执行分享
if (content.platform != null) {
shareToPlatform(activity, content, content.platform, callback)
} else {
showShareDialog(activity, content, callback)
}
}
private fun shareToPlatform(
activity: Activity,
content: ShareContent,
platform: SharePlatform,
callback: (ShareResponse) -> Unit
) {
// 生成唯一的 requestCode
val requestCode = requestCodeCounter++
callbacks[requestCode] = callback
// 调用友盟 SDK 进行分享
val shareMedia = createShareMedia(activity, content)
val shareAction = ShareAction(activity)
shareAction.withMedia(shareMedia)
shareAction.setPlatform(toShareMedia(platform))
shareAction.setCallback(createShareListener(platform, requestCode, callback))
shareAction.share()
}
override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
// 转发给友盟 SDK 处理
UMShareAPI.get(activity).onActivityResult(requestCode, resultCode, data)
}
private fun createShareListener(
platform: SharePlatform,
requestCode: Int,
callback: (ShareResponse) -> Unit
): UMShareListener {
return object : UMShareListener {
override fun onResult(shareMedia: SHARE_MEDIA?) {
// 找到对应的回调并调用
callbacks[requestCode]?.invoke(
ShareResponse(success = true, data = platform)
)
callbacks.remove(requestCode)
}
override fun onError(shareMedia: SHARE_MEDIA?, throwable: Throwable?) {
callbacks[requestCode]?.invoke(
ShareResponse(
success = false,
data = platform,
errorMessage = throwable?.message
)
)
callbacks.remove(requestCode)
}
override fun onCancel(shareMedia: SHARE_MEDIA?) {
callbacks[requestCode]?.invoke(
ShareResponse(
success = false,
data = platform,
errorMessage = "用户取消分享"
)
)
callbacks.remove(requestCode)
}
}
}
}
ShareProxyActivity.kt 文件AndroidManifest.xml 中移除 ShareProxyActivity 的声明shareManual() 方法(不再需要)class UserFragment : Fragment() {
private val shareService = ShareServiceFactory.getInstance()
private fun shareContent() {
val content = ShareContent.builder()
.setTitle("分享标题")
.setDescription("分享描述")
.setUrl("https://example.com")
.build()
// 调用统一分享方法
shareService.share(requireActivity(), content) { response ->
if (response.success) {
Toast.makeText(requireContext(), "分享成功", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(requireContext(), "分享失败: ${response.errorMessage}", Toast.LENGTH_SHORT).show()
}
}
}
}
重要:业务层必须在 Activity 中处理 onActivityResult:
class MainActivity : AppCompatActivity() {
private val shareService = ShareServiceFactory.getInstance()
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// 必须调用:处理分享回调
shareService.onActivityResult(this, requestCode, resultCode, data)
}
}
shareToWeChat(), shareToQQ() 等)onActivityResult() 处理share() 方法的代码无需改动shareToWeChat() 等)shareManual() 方法share() 方法的文档说明share() 方法,不再启动 ShareProxyActivityonActivityResult() 方法,从回调 Map 中查找并调用回调ShareProxyActivity.kt 文件AndroidManifest.xml 中移除相关声明集成说明.mdonActivityResult() 处理说明✅ 灵活性更高:业务层可以自行处理回调
✅ 减少 Activity 栈:不再启动代理 Activity
✅ 代码更简洁:移除复杂的 Activity 生命周期管理
✅ 更符合 Android 规范:业务层直接处理回调
❌ 增加业务层负担:业务层必须在 Activity 中处理 onActivityResult
❌ 可能遗漏回调:如果业务层忘记处理 onActivityResult,分享回调将丢失
❌ Fragment 使用不便:Fragment 需要依赖 Activity 的 onActivityResult
shareService.onActivityResult()onActivityResult重构后的分享模块:
ShareProxyActivity,不再通过代理 Activity 处理回调share() 方法onActivityResult这个方案更符合 Android 的开发规范,也给了业务层更多的控制权。