現象描述
這是一個橫屏的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在開機時重啓兩次解決辦法