首页  编辑  

安卓单例模式的Activity都会被销毁并重新创建?

Tags: /Android/   Date Created:
安卓开发的一个坑。

程序MainActivity是单例模式android:launchMode="singleInstance" ,但是在某些手机下,会出现窗体被销毁然后重新创建的情况(onCreate和onDestroy)被调用两次
尤其是可能在电信手机卡下出现问题,原因在于系统启动后,搜索可用网络,当搜索到可用网络后,发现可用网络与系统默认的网络不一样(mcc,mnc)变了,就会发出一个通知,但窗体没有处理的话,就会被销毁并重新创建了,导致重复两次。
记得,不光是mcc,mnc变化会引起窗体,其他的配置如果你不处理,也会出现类似问题。
解决方法,在AndroidManifest.xml中,相关的activity部分,例如mainactivity中增加configChanges代码:
<activity android:name=".MainActivity"
    android:configChanges="mcc|mnc|orientation|keyboardHidden"
    android:launchMode="singleInstance">
然后重载窗体的onConfigurationChanged,处理一下即可:
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    
    // 检测屏幕的方向:纵向或横向
    if (this.getResources().getConfiguration().orientation
            == Configuration.ORIENTATION_LANDSCAPE) {
        //当前为横屏, 在此处添加额外的处理代码
    }
    else if (this.getResources().getConfiguration().orientation
            == Configuration.ORIENTATION_PORTRAIT) {
        //当前为竖屏, 在此处添加额外的处理代码
    }
    //检测实体键盘的状态:推出或者合上
    if (newConfig.hardKeyboardHidden
            == Configuration.HARDKEYBOARDHIDDEN_NO){
        //实体键盘处于推出状态,在此处添加额外的处理代码
    }
    else if (newConfig.hardKeyboardHidden
            == Configuration.HARDKEYBOARDHIDDEN_YES){
        //实体键盘处于合上状态,在此处添加额外的处理代码
    }
}