安卓4.0下intent.putExtra()引发应用崩溃,求解决方法
解决Android 4.0启动带putExtra的Activity崩溃问题
这种SIGSEGV at 0xdeadd00d的崩溃在Android 4.x系统上特别常见,尤其是通过Intent传递自定义对象的时候。我帮你梳理几个最可能的原因和对应的解决办法:
1. 自定义对象的序列化实现有问题
你传递的Site对象如果是用Serializable或Parcelable实现的,Android 4.0对这两种序列化方式的兼容性要求更严格:
- 如果是Serializable:
- 必须显式声明
serialVersionUID,否则系统自动生成的UID在不同版本可能不匹配,导致反序列化崩溃。 - 确保
Site里的所有成员变量要么是基本类型,要么也实现了Serializable;如果有不需要序列化的变量,要加transient关键字。
示例代码:
public class Site implements Serializable { // 一定要显式定义这个UID private static final long serialVersionUID = 123456789L; private String siteName; private int siteId; // 如果有Bitmap这类非Serializable对象,加transient private transient Bitmap siteIcon; // 构造方法、getter/setter... } - 必须显式声明
- 如果是Parcelable:
- 必须保证
writeToParcel和createFromParcel中的字段读写顺序完全一致,比如先写字符串就先读字符串,先写int就先读int。 - 检查
CREATOR是否正确实现,尤其是newArray方法不能返回null。
- 必须保证
2. Intent传递的对象体积过大
Android 4.0对Intent中携带的数据大小有严格限制,如果Site对象里包含大体积内容(比如高清Bitmap、超长字符串),很容易触发内存异常导致VM abort。
解决办法:不要通过Intent传递大对象,改用这些方式:
- 用Application类存储临时对象:
启动前先存对象:// 自定义Application类 public class MyApp extends Application { private Site tempSite; public Site getTempSite() { return tempSite; } public void setTempSite(Site site) { this.tempSite = site; } }
目标Activity中获取:((MyApp) getApplication()).setTempSite(yourSiteObject); Intent intent = new Intent(MainActivity.this, SiteActivity.class); startActivity(intent);Site site = ((MyApp) getApplication()).getTempSite(); // 用完后记得置空,避免内存泄漏 ((MyApp) getApplication()).setTempSite(null); - 或者用单例类、本地数据库临时存储等方式传递数据。
3. 硬件加速设置无效的问题
你设置的android:hardwareAccelerated="false"可能没生效——要确保是在目标Activity的标签里设置,而不是全局Application标签。不过从报错来看,这次崩溃大概率和硬件加速无关,优先排查前两个问题。
快速调试技巧
- 先简化Intent:暂时去掉
putExtra,直接启动SiteActivity,如果能正常启动,100%是对象传递的问题。 - 逐步精简
Site对象:去掉非必要的成员变量,一步步测试,定位到导致崩溃的具体字段。
内容的提问来源于stack exchange,提问作者Daniel kovalesky
相关产品推荐
相关产品推荐

