Как работать с одним и тем же фильтром намерений для двух действий?
Я пытаюсь реализовать глубокие ссылки в моем приложении. У меня есть два вида деятельности: 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. Надеюсь, что это поможет вам:)