app 在應用市場下載完成後,點擊打開,按照 app 的通常流程首先會啓動 Splash 界面,再進入首頁。此時你按下 home 鍵,再從桌面點擊應用圖標,你會發現應用又走到了 Splash 界面再進入首頁。再次按 home 鍵重複剛纔的動做現象依舊,經過將應用結束或殺掉進程應用就會恢復正常。固然這種現象理論上來講在你安裝完應用後只會出現一次,但終歸仍是會影響用戶體驗。(若是用戶進入了比較深層次的頁面,這個體驗對用戶來講絕對是個災難)java
你們能夠去隨便下一款 app 試一下,大機率會有這種現象,好比下面的 app。android
大廠 app 就不要試了,別人早就處理好了這個問題。因此先看一下網易和 b站是怎麼解決這個問題的。app
咱們先來看網易的解決辦法:this
paramJoinPoint = paramAdActivity.getIntent();
int k = 0;
int i;
if ((paramJoinPoint != null) && (paramAdActivity.getIntent().getBooleanExtra("out", false))) {
i = 1;
} else {
i = 0;
}
long l = System.currentTimeMillis();
paramAdActivity.setTheme(2131689487);
int j = k;
if (!paramAdActivity.isTaskRoot()) // 關鍵代碼1
{
j = k;
if (paramAdActivity.getIntent() != null)
{
j = k;
if ((paramAdActivity.getIntent().getFlags() & 0x400000) != 0) { // 關鍵代碼 2
j = 1;
}
}
}
if (j == 0) {
fp.a(paramAdActivity.getIntent(), AdFragment.class.getName(), "AdFragment", null);
}
paramAdActivity.onCreate(paramBundle);
if (j != 0)
{
paramAdActivity.finish();
return;
}
複製代碼
核心邏輯以下spa
if(!isTaskRoot) {
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
}
複製代碼
/** * This flag is not normally set by application code, but set for you by * the system as described in the * {@link android.R.styleable#AndroidManifestActivity_launchMode * launchMode} documentation for the singleTask mode. */
public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 0x00400000;
複製代碼
接着是 B 站的:3d
Object localObject;
if ((m.a.a((Context)this)) && (!isTaskRoot()))
{
localObject = getIntent();
Intrinsics.checkExpressionValueIsNotNull(localObject, "intent");
localObject = ((Intent)localObject).getAction();
if ((getIntent().hasCategory("android.intent.category.LAUNCHER")) && (TextUtils.equals((CharSequence)localObject, (CharSequence)"android.intent.action.MAIN")))
{
m.a.b((Context)this);
b(); // 調用 finish()
return;
}
}
複製代碼
核心邏輯以下:code
if(!isTaskRoot()) {
if ((getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)) && (TextUtils.equals(getIntent().getAction(), Intent.ACTION_MAIN)) {
finish();
return
}
}
複製代碼
兩種方案的邏輯判斷都很簡單,且前置條件都是先判斷 isTaskRoot,差別在於後續的判斷處理,就我我的而言以爲 b 站的方案更易於理解。orm