解决Android开发中遇到的一些小问题
一、我们在开发的过程中喜欢将一些app常用的数据对象保存在Application中,使用起来很方便。但是有的时候APP崩溃了,原因是空指针,而导致空指针的原因正式正式这些数据。
用户按home键退出app。长时间的其他操作过后,系统为了回收内存kill掉了这个app。接下来就是crash的部分了,用户重新打开这个App。Android系统创建一个新的MyApplication 实例并恢复 当前Activity。当前Activity从新的MyApplication去获取对象,由于这个MyApplication是系统新创建的对象,之前保存的数据全为空了,这是因为application 对象不会一直呆着内存里面,它会被kill掉。与大家普遍的看法不同之处在于,实际上app不会重新开始启动。
Android系统会创建一个新的 Application 对象,然后启动上次用户离开时的activity以造成这个app从来没有被kill掉得假象。因此在Application中存放对象会产生很严重的后果,推荐使用SP。
二、解决有的手机APP退至后台后点击应用图标,应用重新启动的问题。
在你应用的第一个页面的setContentView(...)之前添加如下代码:
if (!this.isTaskRoot()) {
Intent intent = getIntent();
if (intent != null) {
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
finish();
return;
}
}
}
在清单文件中将该页面的启动模式的代码删除
三、APP主页面使用fragmentManager.beginTransaction()添加fragment时,当退出应用长时间不操作,返回应用时,fragment发生重叠。
原因:因为每当我们离开Activity的时候,切换到后台的时候,当内存不够用,Fragment所在Activity被销毁,会调用onSaveInstanceState()方法,Fragment都会被保存起来,当我再次回到这个app的时候,通过onCreate中的参数savedInstanceState恢复了之前的fragment,但是只是保存了数据,Fragment的show状态并没有被保存起来,就导致了界面重叠。
解决方法
重写onSaveInstanceState(...)空实现,即不允许activity保存我销毁之前的状态
@Override
public void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState, outPersistentState);
}