Ответ 1
Добавить android:launchMode="singleTop"
в манифест в тегах активности LaunchActivity
Глубокая ссылка не работает, если приложение уже открыто глубокой ссылкой.
Однако, если я открою приложение не путем запуска 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
и он будет вести себя одинаково.
Добавить android:launchMode="singleTop"
в манифест в тегах активности LaunchActivity
Я обнаружил, что добавление android:launchMode="singleTask"
работает. singleTop
не работал у меня.
В файле манифеста вашего проекта вам нужно добавить следующее к вашей основной деятельности.
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() вместо создания нового объект.
Более подробную информацию можно найти здесь.
В файле манифеста вашего проекта вам нужно добавить следующее к вашей основной деятельности.
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);
}
}
Файл 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);
}
"добавить android: launchMode =" singleTop "в манифест с вашей деятельностью"
если ваш режим запуска по умолчанию, это предупреждение появляется "Предупреждение: активность не запущена, текущая задача была перенесена на передний план", потому что каждый раз, когда он создает новый экземпляр вашей активности, а если вы используете режим запуска Single Top, то onNewIntent(), который вызывается вместо создания нового объекта
Из журналов, указанных в "Предупреждении: активность не началась, его текущая задача была перенесена на передний план", поэтому новый экземпляр действия не создается. В таких случаях новое намерение будет перенаправлено на onNewIntent (намерение намерения) активности.
В вашем случае я подозреваю, что вы не переопределили этот метод и будете извлекать информацию из mehtod onCreate() активности.
Вместо этого создайте метод, похожий на extractDataFromIntentAndProcess (намерение намерения) и вызовите его из метода oncreate (extractDataFromIntentAndProcess (getIntent())), а также из метода onNewIntent (extractDataFromIntentAndProcess (намерение)) вашей активности.