問(wèn)題描述
在某次項(xiàng)目?jī)?yōu)化中,更新完配置項(xiàng)后,系統(tǒng)會(huì)要求重新啟動(dòng)應(yīng)用使得最新設(shè)置的配置項(xiàng)能夠立即生效.重啟應(yīng)用的代碼如下所示:
/**
* restartApp:重新啟動(dòng)應(yīng)用.
* @param activity 上下文
*/
private void restartApp(Activity activity) {
Intent intent = new Intent(activity, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
// 殺掉進(jìn)程
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
需要被重新拉起的MainActivity在mainfests中的聲明如下:
<activity
android:name="com.keytop.fccc.activity.MainActivity"
android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
實(shí)際上,調(diào)用restartApp方法后,應(yīng)用并沒(méi)有被重新拉起.
試驗(yàn)
我將MainActivity中的 android:launchMode="singleTask" 注釋掉后,再次試驗(yàn),發(fā)現(xiàn)已經(jīng)能夠正常使用了.
原因分析[android:launchMode="singleTask" 惹的禍?]
Activity四大啟動(dòng)模式之一的singleTask: 當(dāng)前棧中如果存在特定的Activity(本例為MainActivity).如果再起請(qǐng)求激活MainActivity時(shí),已經(jīng)存在的MainActivity會(huì)被重用.
但是,很明顯,我在restartApp方法是已經(jīng)聲明了 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);即新建的MainActivity會(huì)在一個(gè)全新的棧中生成.因此不應(yīng)該會(huì)存在已有的MainActivity被復(fù)用的問(wèn)題.