Подтвердить что ты не робот

Глубокая ссылка Android не работает, если приложение открыто глубокой ссылкой уже

Глубокая ссылка не работает, если приложение уже открыто глубокой ссылкой.

Однако, если я открою приложение не путем запуска deeplink, например, щелкнув значок приложения, чтобы открыть приложение. Тогда срабатывание deeplink после этого всегда будет работать.


Вот подробности:

Итак, у меня есть моя активность, настроенная так в AndroidManifest, а именно LaunchActivity.

<activity
    android:name="some.package.name.LaunchActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.SomeTheme">
    <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:scheme="dlscheme" android:host="dlhost" />
    </intent-filter>
</activity>

И в LaunchActivity я бы распечатал журнал onCreate(), чтобы указать, что он был там.

Я использовал

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name

чтобы проверить глубокую ссылку.

Когда приложение было убито, я использовал указанную выше команду. Он может открыть приложение и маршрут к правильной деятельности, без проблем. И иметь следующий журнал.

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
Starting: Intent { act=android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name }
Status: ok
Activity: some.package.name/.activity.LaunchActivity
ThisTime: 898
TotalTime: 898
WaitTime: 919
Complete

Однако, если я снова введу ту же команду, не убив приложение. Он только откроет приложение, но не откроет правильную работу и не создаст следующий журнал.

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
Starting: Intent { act=android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: some.package.name/.activity.LaunchActivity
ThisTime: 0
TotalTime: 0
WaitTime: 6
Complete

с помощью этой дополнительной строки

Warning: Activity not started, its current task has been brought to the front

Я также попробовал это с помощью веб-сайта, используя это хромное намерение:

intent://dlhost/param#Intent;scheme=dlscheme;package=some.package.name;end

и он будет вести себя одинаково.

4b9b3361

Ответ 1

Добавить android:launchMode="singleTop" в манифест в тегах активности LaunchActivity

Ответ 2

Я обнаружил, что добавление android:launchMode="singleTask" работает. singleTop не работал у меня.

Ответ 3

В файле манифеста вашего проекта вам нужно добавить следующее к вашей основной деятельности.

android:launchMode="singleTask"

Итак, в манифесте у вас будет что-то похожее на приведенное ниже:

<activity android:name="some.package.name.LaunchActivity" 
      android:launchMode="singleTask">
      android:screenOrientation="portrait"
      android:theme="@style/Theme.SomeTheme">
          <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:scheme="dlscheme" android:host="dlhost" />
          </intent-filter>
 </activity>

По сути, это создает новую задачу, и новый экземпляр будет выдвигаться в качестве корневого. Однако, если какой-либо экземпляр действия существует в каких-либо задачах, система направляет намерение этому экземпляру действия через вызов метода onNewIntent(). В этом режиме экземпляры операций могут быть перенесены в одну и ту же задачу. И если пользователь нажимает клавишу BACK из текущего действия, система вернет пользователя к предыдущему действию.

С другой стороны, в singleTop если экземпляр действия уже существует в верхней части текущей задачи и системные маршруты направляют это действие, новый экземпляр не будет создан, так как он вызовет метод onNewIntent() вместо создания нового объект.

Более подробную информацию можно найти здесь.

Ответ 4

В файле манифеста вашего проекта вам нужно добавить следующее к вашей основной деятельности.

android:launchMode="singleTask"

И обработать внутреннюю onNewIntent() внутри onNewIntent()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recipe);
    onNewIntent(getIntent());
}

protected void onNewIntent(Intent intent) {
    String action = intent.getAction();
    String data = intent.getDataString();
    if (Intent.ACTION_VIEW.equals(action) && data != null) {
        String recipeId = data.substring(data.lastIndexOf("/") + 1);
        Uri contentUri = RecipeContentProvider.CONTENT_URI.buildUpon()
                .appendPath(recipeId).build();
        showRecipe(contentUri);
    }
}

Ответ 5

Файл Mainefest выглядит следующим образом

<activity
                    android:name=".user.HomeActivity"
                    android:screenOrientation="portrait"
                    android:exported="true"
                    android:launchMode="singleTop"
                    android:windowSoftInputMode="stateAlwaysHidden"
                    android:theme="@style/AppTheme.NoActionBar" >
                    <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="example"/>
                        <data android:host="example.com"
                            android:pathPrefix="/deeplink"/>
                        <action android:name="android.intent.action.MAIN" />
                    </intent-filter>
                </activity>

HomeActivity

@Override
            protected void onNewIntent(Intent intent) {
                super.onNewIntent(intent);
                Uri data = intent.getData();
                if (data != null)
                    callDeep(data);
                setIntent(intent);
                Log.d("DeepLinking", "new intent value==>" + data + "==== value===>");
            }
        //or in on create 
        @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_home);
          Uri data = intent.getData();
                Log.d("DeepLinking", "intent value==>" + data + "==== value===>" + bundle + "===action==>" + action);
        }

Ответ 6

"добавить android: launchMode =" singleTop "в манифест с вашей деятельностью"

если ваш режим запуска по умолчанию, это предупреждение появляется "Предупреждение: активность не запущена, текущая задача была перенесена на передний план", потому что каждый раз, когда он создает новый экземпляр вашей активности, а если вы используете режим запуска Single Top, то onNewIntent(), который вызывается вместо создания нового объекта

Ответ 7

Из журналов, указанных в "Предупреждении: активность не началась, его текущая задача была перенесена на передний план", поэтому новый экземпляр действия не создается. В таких случаях новое намерение будет перенаправлено на onNewIntent (намерение намерения) активности.

В вашем случае я подозреваю, что вы не переопределили этот метод и будете извлекать информацию из mehtod onCreate() активности.

Вместо этого создайте метод, похожий на extractDataFromIntentAndProcess (намерение намерения) и вызовите его из метода oncreate (extractDataFromIntentAndProcess (getIntent())), а также из метода onNewIntent (extractDataFromIntentAndProcess (намерение)) вашей активности.