在pathPrefixes / abc和/ abc / def上打开不同的活动

时间:2016-10-27 07:20:09

标签: android intentfilter

我有两个网址。例如:

  1. http://host.com/abc/12345
  2. http://host.com/abc/def/12345
  3. 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 中排除网址,但我失败了。

3 个答案:

答案 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>