You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Xamarin C#的Android跨应用启动与双向数据交互问题

实现Xamarin.Android应用间启动并双向传值

我来帮你搞定应用B启动应用A、传参并接收返回结果的完整流程,基于你提到的StartActivityForResult机制来实现:

第一步:配置应用A的可启动Activity

首先要确保应用A的目标Activity能被外部应用调用,需要在它的Activity特性中配置Intent Filter(或者直接修改AndroidManifest.xml):

[Activity(Label = "AppAMainActivity")]
[IntentFilter(new[] { "com.yourcompany.action.APP_A_ACTION" }, 
              Categories = new[] { Android.Content.Intent.CategoryDefault })]
public class MainActivity : Activity
{
    // ... 你的Activity原有代码
}

这里自定义了一个专属Actioncom.yourcompany.action.APP_A_ACTION,应用B会通过这个Action精准启动A的目标Activity,避免启动错误的入口页面。

第二步:应用B启动应用A并传递数据

在应用B中,你可以通过自定义Action构建Intent,同时用PutExtra传递操作指令和业务数据:

// 定义请求码,用于后续识别应用A的返回结果
const int RequestCodeAppA = 1001;

public void LaunchAppAWithParams()
{
    PackageManager pm = this.PackageManager;
    Intent intent = new Intent("com.yourcompany.action.APP_A_ACTION");
    // 额外指定应用A的包名,避免同Action的其他应用干扰
    intent.SetPackage("com.yourcompany.ApplicationA");

    if (intent != null && pm.ResolveActivity(intent, 0) != null)
    {
        // 传递操作类型和待处理数据
        intent.PutExtra("OperationType", "ProcessImage");
        intent.PutExtra("ImagePath", "/sdcard/user_photo.png");

        // 启动Activity并等待返回结果
        StartActivityForResult(intent, RequestCodeAppA);
    }
    else
    {
        // 处理应用A未安装的情况
        Toast.MakeText(this, "应用A未安装,请先安装", ToastLength.Short).Show();
    }
}

第三步:应用A接收数据、处理并返回结果

在应用A的目标Activity中,先获取Intent传递的参数,执行对应业务操作后,把结果回传给应用B:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.Main);

    // 接收应用B传来的参数
    string operationType = Intent.GetStringExtra("OperationType");
    string imagePath = Intent.GetStringExtra("ImagePath");

    // 模拟执行业务操作(比如图片压缩、数据解析等)
    Task.Run(async () =>
    {
        bool operationSuccess = await HandleBusinessLogic(operationType, imagePath);
        string resultDesc = operationSuccess ? "处理完成" : "处理失败";

        // 构建返回结果的Intent
        Intent resultIntent = new Intent();
        resultIntent.PutExtra("IsSuccess", operationSuccess);
        resultIntent.PutExtra("ResultDesc", resultDesc);
        // 如果有需要,还可以返回二进制数据或其他类型的结果

        // 设置返回结果码和数据,然后关闭当前Activity回到应用B
        SetResult(Result.Ok, resultIntent);
        Finish();
    });
}

// 模拟你的实际业务处理方法
private async Task<bool> HandleBusinessLogic(string opType, string path)
{
    // 这里替换成你的真实业务逻辑
    await Task.Delay(1500); // 模拟耗时操作
    return true;
}

第四步:应用B接收返回结果

在应用B的Activity中,重写OnActivityResult方法,接收并处理应用A返回的数据:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    // 通过请求码识别是应用A的返回结果
    if (requestCode == RequestCodeAppA)
    {
        if (resultCode == Result.Ok && data != null)
        {
            bool isSuccess = data.GetBooleanExtra("IsSuccess", false);
            string resultDesc = data.GetStringExtra("ResultDesc");

            // 根据返回结果做后续处理
            Toast.MakeText(this, $"应用A返回:{resultDesc}", ToastLength.Long).Show();
        }
        else
        {
            // 处理操作取消或异常的情况
            Toast.MakeText(this, "应用A操作取消或失败", ToastLength.Short).Show();
        }
    }
}

补充:新版本Xamarin.Android的推荐方案

如果你使用的是支持AndroidX的Xamarin.Android版本,推荐使用ActivityResultContracts.StartActivityForResult替代旧的StartActivityForResult,它更适配现代Android生命周期:

在应用B中注册启动器:

private ActivityResultLauncher<Intent> _appALauncher;

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // ... 其他初始化代码

    // 注册Activity结果启动器
    _appALauncher = RegisterForActivityResult(new ActivityResultContracts.StartActivityForResult(), result =>
    {
        if (result.ResultCode == (int)Result.Ok && result.Data != null)
        {
            bool isSuccess = result.Data.GetBooleanExtra("IsSuccess", false);
            string resultDesc = result.Data.GetStringExtra("ResultDesc");
            Toast.MakeText(this, $"应用A返回:{resultDesc}", ToastLength.Long).Show();
        }
    });
}

// 启动应用A的方法
public void LaunchAppANewWay()
{
    Intent intent = new Intent("com.yourcompany.action.APP_A_ACTION");
    intent.SetPackage("com.yourcompany.ApplicationA");
    intent.PutExtra("OperationType", "ProcessImage");
    intent.PutExtra("ImagePath", "/sdcard/user_photo.png");

    _appALauncher.Launch(intent);
}

内容的提问来源于stack exchange,提问作者Chris Dafnis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:59