Как работать с одним и тем же фильтром намерений для двух действий?

Я пытаюсь реализовать глубокие ссылки в моем приложении. У меня есть два вида деятельности: 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>

Что я делаю: когда приложение уже открыто, я хочу, чтобы MainActivity была запущена, а когда приложение не открыто, я хочу, чтобы splashScreenActivity была запущена. Но появляется всплывающее окно и ожидает, что я выберу одно из этих занятий, я не хочу этого. Я хочу, чтобы он был выбран автоматически. Итак, как я могу это реализовать?

Спасибо

3 ответа

Решение

-> Прежде всего, вы не хотите иметь несколько вариантов выбора означает, что вы хотите только один вариант. Так что просто у вас должен быть только один 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>

-> Вы хотите решить следующий поток на основе некоторого условия, например, находится ли ваше приложение на переднем плане или нет, поэтому просто поместите эту логику в 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;
}

Исходя из приведенной выше логики, вы можете перенаправить пользователя на SplashScreenActivity или же MainActivity,

Замечания:

Поскольку вы хотите получить выполняемые в данный момент задачи, вам необходимо добавить указанные ниже права доступа в файл манифеста.

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

Вы сталкиваетесь с ожидаемым поведением. Если у вас есть два действия с одним и тем же намерением, вы увидите диалог выбора.

Удалить Intent-filter от MainActivity и добавьте 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>

И просто опубликовать вас Intent через SplashScreenActivity к MainActivity и обрабатывать Intent в onNewEvent И в onCreate функции. больше оlaunchMode

Надеюсь, поможет.

В вашем случае вы используете как Launcher, так и Default для одной операции (SplashScreenActivity), которая является проблемой. Для ваших нужд сначала проверьте, открыто приложение или нет. Если приложение открыто до метода setcontentview в этом SplashScreenActivity, запустите mainActivity. если приложение не открыто, запустите SplashScreenActivity. Надеюсь, что это поможет вам:)

Другие вопросы по тегам