修復Android App在開機後入口類被啓動兩次的bug

現象描述

這是一個橫屏的App,AndroidManifest中配置了 shareUserId

android:sharedUserId="android.uid.system"

添加了開機啓動廣播

public class BootBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

MainActivity配置了launchMode

        <activity
            android:name="yqgj.ui.MainActivity"
            android:screenOrientation="landscape"
            android:windowSoftInputMode="stateHidden|adjustResize"
            android:launchMode="singleTask"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

此App裝在了車載的一體機(Android4.4系統),當一體機開機後,App隨之啓動併到前臺,此時通過log打印發現

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("重複OnCreate()");
	}

重複OnCreate()打印了兩次,中間間隔5秒左右,之後所有onCreate裏的方法都執行了兩次

解決之道

1、有人說是因爲橫豎屏轉換導致oncreate被執行了兩次,檢查了代碼,發現程序裏有用到高德離線地圖

        <activity android:name="com.amap.api.maps.offlinemap.OfflineMapActivity"
            android:screenOrientation="portrait"  />

於是把這個portrait改成了landscape,重新測試下無效,因爲根本都不會打開這個OfflineMapActivity
2、橫豎屏轉換時要添加configChanges的配置

 android:configChanges="orientation|keyboardHidden" 

測試下來無效
3、還有人說用其他的啓動模式,要這麼說,相對而言也就singleInstance稍微合適了,測試下來也無效

正確方法

在主Activity配置清單中添加configChanges,原因是mcc值會發生變化,至於爲啥會發生變化,不得而知

android:configChanges="mcc|mnc"

添加此配置後,即使mcc或者mnc發生變化,也不會重啓
詳情可參考博文 Launcher Activity在開機時重啓兩次解決辦法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章