Android - 如果应用程序是通过单击URL启动的,则DeepLink不起作用

问题描述:

我正在使用DeepLinkingActivity来处理深层链接,并且如果目标活动不在顶层,则防止其无法使用。Android - 如果应用程序是通过单击URL启动的,则DeepLink不起作用

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    handleIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 

    handleIntent(intent); 
} 

private void handleIntent(Intent intent){ 
    Uri data = intent.getData(); 

    if(data != null) { 
     final Intent newIntent = new Intent(this, LauncherActivity.class); 

     if(!isTaskRoot()) { 
      newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
        | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     } 

     newIntent.setData(data); 
     startActivity(newIntent); 
    } 

} 

我用android:noHistory="true"在AndroidManifest所以我并不需要调用finish()。 如果通过单击应用程序图标或单击通知启动应用程序,它会很好地工作。 如果通过单击URL来启动它,那么如果我单击相同的URL(未调用onCreatenewIntent),则深层链接将不会再工作。但是,如果我点击其他人,它工作正常。 也就是说,如果点击“www.google.com”将启动我的应用程序,那么这个URL将不会再工作,直到我关闭我的应用程序。但是“www.yahoo.com”即使点击过多次也能正常工作。

我使用API​​ 26,支持库26.0.2。

问题通过将android:launchMode="singleTask"添加到清单解决。

<activity android:name=".DeepLinkActivity" 
       android:noHistory="true" 
       android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW"/> 

      <category android:name="android.intent.category.DEFAULT"/> 
      <category android:name="android.intent.category.BROWSABLE"/> 

      <data android:scheme="http"/> 
      <data android:scheme="https"/> 
      <data android:host="www.mydomain.com"/> 
      <data android:pathPattern="/page/..*/M\\..*"/> 
     </intent-filter> 
    </activity> 

<activity 
     android:name=".LauncherActivity" 
     android:label="@string/app_name" 
     android:launchMode="singleTop" 
     android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> 

</activity> 

<activity android:name=".SplashActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 

     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity> 

所以它不会启动第二个LauncherActivity,可以通过点击链接启动。