android 記一次打開應用後的通病

現象描述

app 在應用市場下載完成後,點擊打開,按照 app 的通常流程首先會啓動 Splash 界面,再進入首頁。此時你按下 home 鍵,再從桌面點擊應用圖標,你會發現應用又走到了 Splash 界面再進入首頁。再次按 home 鍵重複剛纔的動做現象依舊,經過將應用結束或殺掉進程應用就會恢復正常。固然這種現象理論上來講在你安裝完應用後只會出現一次,但終歸仍是會影響用戶體驗。(若是用戶進入了比較深層次的頁面,這個體驗對用戶來講絕對是個災難)java

你們能夠去隨便下一款 app 試一下,大機率會有這種現象,好比下面的 app。android

liuli

大廠 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

相關文章
相關標籤/搜索