Android跨应用传值异常:Int类型正常但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

