如何为两个活动处理相同的意图过滤器?

时间:2014-12-08 11:37:36

标签: android android-intent deep-linking

我正在尝试在我的应用中实现深层链接。我有两个活动:SplashScreenActivity和MainActivity。两个活动都具有相同的意图过滤器,例如:

<activity
        android:name="com.example.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <data
                android:host="product"
                android:scheme="gg" />

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

<activity
        android:name="com.example.SplashScreenActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <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="product"
                android:scheme="gg" />
        </intent-filter>
    </activity>

我所做的是:当app已经打开时,我希望触发MainActivity,当app未打开时,我想要触发splashScreenActivity。但是出现了一个弹出窗口并希望我选择其中一个活动,我不希望这样。我想让它自动选择。那么,我该如何实现呢?

由于

3 个答案:

答案 0 :(得分:3)

你面对预期的行为。如果您有两个活动处理相同的意图,您将面对选择器对话框。

从MainActivity中移除Intent-filter,然后添加android:launchMode=singleTask

<activity
        android:name="com.gittigidiyormobil.MainActivity" 
    android:launchMode=singleTask>
</activity>

<activity
        android:name="com.gittigidiyormobil.SplashScreenActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <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="product"
                android:scheme="gg" />
        </intent-filter>
    </activity>

只需通过SplashScreenActivity将Intent发布到MainActivity,并在IntentonNewEvent函数中处理onCreatemore about launchMode

希望它有所帮助。

答案 1 :(得分:3)

- &GT;首先,您不希望有多个选项来选择意味着您只想要一个选项。因此,您应该只有一个Activity来处理此类事件。

即:如下所述,您应该在清单文件中有DeepLinkingActivity

<activity
        android:name="com.example.DeepLinkingActivity" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <data
                android:host="product"
                android:scheme="gg" />

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

<activity
        android:name="com.example.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />


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

<activity
        android:name="com.example.SplashScreenActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

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

- &GT;您希望根据某些条件决定下一个流程,例如您的应用是否在前台,所以只需将该逻辑放在DeepLinkingActivity中,并确保不设置任何布局文件对于那项活动。

即:

private boolean isAppInForeground(Context ctx) {
    ActivityManager activityManager = (ActivityManager) ctx.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE);

    if (services == null) {
        return false;
    }

    if (services.size() > 0 && services.get(0).topActivity.getPackageName().toString().equalsIgnoreCase(ctx.getApplicationContext().getPackageName().toString())) {
        return true;
    }

    return false;
}

根据以上逻辑,您可以将用户重定向到SplashScreenActivityMainActivity

注意:

由于您要检索当前正在进行的任务,您需要在清单文件中添加以下权限。

    <uses-permission android:name="android.permission.GET_TASKS" />

答案 2 :(得分:0)

在您的情况下,您使用Launcher和Default作为问题的单个活动(SplashScreenActivity)。根据您的需要,首先检查应用程序是否打开。如果应用程序在此SplashScreenActivity中的setcontentview方法之前打开,则启动mainActivity。如果应用程序未打开启动SplashScreenActivity。希望这会对你有所帮助:)。