Android Java中带SurfaceView的两个Activity传值崩溃问题
解决SurfaceView Activity间传值崩溃的问题
看来你碰到了个典型的Android开发坑——没加Intent数据读取逻辑时一切正常,一加就崩溃,还是两个SurfaceView类型的Activity。结合你的场景,我整理了几个最可能的原因和对应的解决步骤:
1. 先检查score1的类型是否支持序列化
Intent的putExtra()要求传递的对象必须是可序列化的,比如基本类型、String,或者实现了Serializable/Parcelable接口的自定义类。如果score1是自定义类型但没做序列化处理,传递时不会立刻报错,但第二个Activity读取时就会直接崩溃。
- 快速验证&解决:
- 如果score1是int、float这类基本类型或String,直接跳过这步;
- 如果是自定义类,先给它加上
Serializable接口(最简单的验证方式):public class YourScoreClass implements Serializable { // 你的类成员和方法 } - 要是追求性能,也可以用Android推荐的
Parcelable接口,但Serializable足够快速定位问题。
2. 排查第二个Activity的读取代码是否有误
崩溃大概率出在读取Intent数据的环节,比如类型不匹配、没做空判断,这些都是新手常踩的坑。
给你一个安全的读取示例,避免空指针和类型错误:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先判断Intent是否存在,防止意外为空 if (getIntent() != null) { // 根据score1的实际类型选择对应的get方法 // 如果是int类型: int receivedScore = getIntent().getIntExtra("score_var", 0); // 第二个参数是默认值,没传值时不会崩 // 如果是String: // String receivedScore = getIntent().getStringExtra("score_var"); // 如果是自定义序列化类: // YourScoreClass receivedScore = (YourScoreClass) getIntent().getSerializableExtra("score_var"); } // 再去初始化SurfaceView相关逻辑... }
常见错误点:
- 用错了get方法:比如传的是int,却调用
getStringExtra(); - 没加默认值,Intent意外为空时直接触发空指针;
- 自定义类强转时出错(比如没实现序列化就强转)。
3. 避免SurfaceView初始化和Intent读取的时机冲突
因为两个Activity都是SurfaceView,第二个Activity的SurfaceView回调(比如surfaceCreated())可能比Intent读取的时机更早,要是你在回调里直接读取Intent,就可能拿到空值或者未初始化的数据导致崩溃。
解决办法:
- 优先在
onCreate()里读完Intent数据,把值存为Activity的成员变量; - 之后在SurfaceView的回调逻辑里,直接使用这个提前存好的成员变量,而不是在回调里再去读Intent。
4. 一定要看LogCat的崩溃日志!
这是最快定位问题的办法!打开Android Studio的LogCat,过滤Error级别,找到崩溃的栈信息——比如是ClassCastException(类型转换错)、NullPointerException(Intent为空)还是NotSerializableException(对象不可序列化),根据日志能直接锁定问题根源。
内容的提问来源于stack exchange,提问作者André Castro
相关产品推荐
相关产品推荐

