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

Android跨应用传值异常:Int类型正常但String类型为Null

解决跨应用传递String参数为Null的问题

看起来你遇到的问题挺典型的——跨应用传Int正常,但String类型的用户名、密码总是拿不到值。结合你提供的代码片段和Android跨进程通信的常见坑,我整理了几个排查和解决的方向:

1. 先确认「参数键名」完全一致

这是最容易踩的坑!Android的Intent Extra键是大小写敏感的,应用A里定义的UsernameMessage、PasswordMessage常量值,必须和应用B中getStringExtra()传入的字符串完全匹配,包括大小写、特殊字符甚至空格。

比如应用A里如果是这么定义的:

public const string UsernameMessage = "com.yourcompany.app.USERNAME";
public const string PasswordMessage = "com.yourcompany.app.PASSWORD";

那应用B里必须严格用同样的字符串取值:

String username = getIntent().getStringExtra("com.yourcompany.app.USERNAME");
String password = getIntent().getStringExtra("com.yourcompany.app.PASSWORD");

哪怕只是把USERNAME写成Username,都会导致取不到值返回Null。

2. 检查传递的String值本身是否有效

在应用A调用PutExtra之前,先确认javaUsername和javaPassword不是Null或空字符串。可以加个日志或者断点验证:

Console.WriteLine($"准备传递的用户名:{javaUsername},密码:{javaPassword}");
if (string.IsNullOrEmpty(javaUsername) || string.IsNullOrEmpty(javaPassword)) {
    throw new InvalidOperationException("用户名或密码不能为空");
}

如果这里输出就是Null,那问题根源在应用A的变量赋值环节,和跨应用传递无关。

3. 核对应用B的Intent接收逻辑

情况一:Activity是首次启动

如果应用B的目标Activity是第一次打开,直接在onCreate里获取Intent参数即可,但要先判空:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    Intent receivedIntent = getIntent();
    if (receivedIntent != null) {
        String username = receivedIntent.getStringExtra("com.yourcompany.app.USERNAME");
        String password = receivedIntent.getStringExtra("com.yourcompany.app.PASSWORD");
        // 打日志确认结果
        Log.d("AppB_Debug", "收到的用户名:" + username);
        Log.d("AppB_Debug", "收到的密码:" + password);
    }
}

情况二:Activity设置了特殊启动模式

如果应用B的Activity在Manifest里设置了launchMode="singleTask"或singleInstance,那么重复启动时不会走onCreate,而是走onNewIntent。这时候需要手动更新Intent并处理:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent); // 将当前Activity的Intent替换为最新的
    processReceivedIntent(intent); // 统一处理参数的方法
}

private void processReceivedIntent(Intent intent) {
    if (intent != null) {
        String username = intent.getStringExtra("com.yourcompany.app.USERNAME");
        String password = intent.getStringExtra("com.yourcompany.app.PASSWORD");
        Log.d("AppB_Debug", "onNewIntent收到的用户名:" + username);
    }
}

4. 适配Android 11+的包可见性限制

如果你的应用目标SDK是Android 11(API 30)及以上,需要在应用A的AndroidManifest.xml里添加对应用B的包查询权限,否则可能无法正常获取到B的Launch Intent(不过你说Int能传递,这一步可能不是主因,但可以排查):

<queries>
    <package android:name="com.yourcompany.appb" /> <!-- 替换为应用B的实际包名 -->
</queries>

按上面的步骤排查下来,大概率能解决String参数为Null的问题——毕竟Int能正常传递,说明跨应用的Intent通道是通的,问题基本出在键名匹配或者接收逻辑上。

内容的提问来源于stack exchange,提问作者Nikita Goncharuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:13