我有两个网址。例如:
http://host.com/abc/12345
http://host.com/abc/def/12345
12345
- 是某个ID。
我想为这些网址开设不同的活动。
目前我在 AndroidManifest.xml :
中有下一个实现<activity
android:name=".ui.activities.Activity1"
android:windowSoftInputMode="adjustResize">
<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" android:host="host.com" android:pathPrefix="/abc"/>
</intent-filter>
</activity>
<activity
android:name=".ui.activities.Activity2"
android:windowSoftInputMode="adjustResize">
<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" android:host="host.com" android:pathPrefix="/abc/def"/>
</intent-filter>
</activity>
第一个网址效果很好:当我点击它时,android建议我使用其他一些应用或我的 Activity1 。
但是当我点击第二个网址时出现问题:android建议我使用其他一些应用或我的 Activity1 或我的 Activity2 。< / p>
所以我的问题是:有没有办法从建议列表中排除 Activity1 。
我尝试使用pathPattern
并试图搜索如何从 IntentFilter 中排除网址,但我失败了。
答案 0 :(得分:1)
由于我没有通过`AndroidManifest.xml'找到优雅的解决方案,我决定通过代码实现“选择”逻辑的一部分。所以我在这里:
在清单文件中,我们定义UrlActivity
,它会响应任何网址,例如“http://host.com/abc/ ...”,所以它看起来像:
<activity
android:name=".ui.activities.UrlActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize">
<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" android:host="host.com" android:pathPrefix="/abc"/>
</intent-filter>
</activity>
然后我们定义专门针对Component
调整的接口UrlActivity
(您可以选择任何取决于行为的名称)。在简单的情况下,它可以只从活动中复制类似的方法。例如:
public interface Component {
void onStart();
void onStop();
}
然后在你的UrlActivity
检索uri并选择适当的组件实现。例如:
private Component component;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
List<String> segments = uri.getPathSegments();
if (segments.contains("def")) {
component = new Component2(...);
} else {
component = new Component1(...);
}
}
@Override
protected void onStart() {
super.onStart();
component.onStart();
}
@Override
protected void onStop() {
super.onStop();
component.onStop();
}
与@KamranAhmed解决方案相比,此解决方案具有优势:可扩展性,减少重复。但它也有一个缺陷:您需要编写更多代码并考虑适合此解决方案的架构。所以它确实比@KamranAhmed方法更难,但对我来说它更干燥灵活。
答案 1 :(得分:0)
我认为你应该这样做:
<activity android:windowSoftInputMode="adjustResize"
android:name=".ui.activities.Activity1" >
<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" android:host="host.com"
android:pathPattern="http://host.com/abc/12345"
android:pathPrefix="/abc/12345"/>
</intent-filter>
</activity>
<activity android:windowSoftInputMode="adjustResize" android:name=".ui.activities.Activity2">
<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" android:host="host.com"
android:pathPattern="http://host.com/abc/def/12345"
android:pathPrefix="/abc/def/12345"/>
</intent-filter>
</activity>
希望它能帮助你...
答案 2 :(得分:0)
我想不出更好的方法,但这有效:
<activity
android:name=".ui.activities.Activity1"
android:windowSoftInputMode="adjustResize">
<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:host="test.com"
android:pathPattern="/abc/1.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/2.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/3.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/4.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/5.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/6.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/7.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/8.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/9.*"
android:scheme="http"/>
<data
android:host="host.com"
android:pathPattern="/abc/0.*"
android:scheme="http"/>
</intent-filter>
</activity>
<activity
android:name=".ui.activities.Activity2"
android:windowSoftInputMode="adjustResize">
<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:host="host.com"
android:pathPattern="/abc/def/.*"
android:scheme="http"/>
</intent-filter>
</activity>