android 两个bug

2018-10-19  本文已影响0人  静夜思亲

解决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);
    }
上一篇下一篇

猜你喜欢

热点阅读