在清单中声明自定义 URL 模式导致在完整操作对话框中重复应用
Declaring custom URL schema in manifest causing duplicate application in complete action dialog
我想在我的应用程序中打开深度 link 对话框,因此我在清单中定义了以下内容:
<activity
android:name=".ActivityA"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="rentaldashboard" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="my.site.com" />
<data android:pathPattern=".*" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<activity
android:name=".ActitivtyB"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="rentalreset" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="my.site.com" />
<data android:pathPattern=".*" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
ActivityA 和 ActivityB 使用模式,当我 运行 上面的代码显示对话框如下:
对话框列出了我的应用程序徽标两次。我一次只希望两个 activity 分别打开一个徽标。那么知道我怎样才能让它成为可能吗?
如果您只有部分 url,例如 ActivityA 的 /user
或 /news
,而 /admin
仅适用于 ActivityB,那么您应该改进路径过滤器。顺便说一下,它们必须以斜杠开头,而且模式不是正则表达式。
如果您想支持自定义方案和 http(s) url,那么您应该使用多个 Intent 过滤器:
<activity
android:name=".ActivityA"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="dev.worldofrental.com" />
<data android:host="www.worldofrental.com" />
<data android:pathPrefix="/urlredirect/getstarted" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<intent-filter>
<data android:scheme="your.package.name"
android:host="getstarted" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
<activity
android:name=".ActitivtyB"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="dev.worldofrental.com" />
<data android:host="www.worldofrental.com" />
<data android:pathPrefix="/urlredirect/resetpassword" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<intent-filter>
<data android:scheme="your.package.name"
android:host="resetpassword" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
总的来说,我建议使用包名称作为方案,以确保没有其他应用程序 "steal" 您的意图。
我想在我的应用程序中打开深度 link 对话框,因此我在清单中定义了以下内容:
<activity
android:name=".ActivityA"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="rentaldashboard" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="my.site.com" />
<data android:pathPattern=".*" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<activity
android:name=".ActitivtyB"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="rentalreset" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="my.site.com" />
<data android:pathPattern=".*" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
ActivityA 和 ActivityB 使用模式,当我 运行 上面的代码显示对话框如下:
对话框列出了我的应用程序徽标两次。我一次只希望两个 activity 分别打开一个徽标。那么知道我怎样才能让它成为可能吗?
如果您只有部分 url,例如 ActivityA 的 /user
或 /news
,而 /admin
仅适用于 ActivityB,那么您应该改进路径过滤器。顺便说一下,它们必须以斜杠开头,而且模式不是正则表达式。
如果您想支持自定义方案和 http(s) url,那么您应该使用多个 Intent 过滤器:
<activity
android:name=".ActivityA"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="dev.worldofrental.com" />
<data android:host="www.worldofrental.com" />
<data android:pathPrefix="/urlredirect/getstarted" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<intent-filter>
<data android:scheme="your.package.name"
android:host="getstarted" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
<activity
android:name=".ActitivtyB"
android:screenOrientation="portrait"
android:theme="@style/AppBaseTheme"
android:windowSoftInputMode="stateHidden|stateVisible" >
<intent-filter>
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="dev.worldofrental.com" />
<data android:host="www.worldofrental.com" />
<data android:pathPrefix="/urlredirect/resetpassword" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<intent-filter>
<data android:scheme="your.package.name"
android:host="resetpassword" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
总的来说,我建议使用包名称作为方案,以确保没有其他应用程序 "steal" 您的意图。