Я пытаюсь внедрить Deeplinking в свое собственное приложение Android.Ссылка отправляется через SMS и при нажатии на нее открывается приложение, и на основе URL-адреса, по которому я перехожу на перкулярный экран, используется android:launchMode="singleTop"
.Проблема, с которой я столкнулся, заключается в том, что при нажатии на ссылку открывается новый экземпляр приложения, и я не хотел этого, поэтому я изменил значение с android:launchMode="singleTask"
на мое activity
в AndroidManifest.xml
, и теперь существует только один экземпляр.Но теперь, когда нажата ссылка из SMS, она возобновляет существующую страницу, и я не могу получить URL, по которому щелкнули.
Я реализовал «AppState», чтобы знать, когда возобновляется экран, но это тоже не дает мне URL.
То, чего я хочу достичь, это либо
- Приложение для полного перезапуска с самого начала
Splash activity
, и я знаю, что могу получить URL и переходить оттуда на основена URL.(android:launchMode="singleTop"
не перезапускает приложение, но открывает новый экземпляр) - Или когда пользователь нажимает ссылку URL, даже если он возобновляет существующий экран, я хочу получить URL и перейти к перкулярномуscreen.
Manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.abcdabcdapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
//This is what is required to open from the link
<intent-filter android:label="ABCD App">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="http"
android:host="abcd"
android:pathPrefix="/createpassword" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
Ссылка, отправляемая в виде SMS - http://abcd/createpassword
Заставка - начальный экран.
componentDidMount() {
setTimeout(() => {
this.whereShoulINavigateTo();
}, 2500);
}
whereShoulINavigateTo = async () => {
if (Platform.OS === 'android') {
Linking.getInitialURL().then( async (url) => {
//this.navigate(url);
if(url === 'http://abcd/createpassword')
{
this.props.navigation.navigate('CreatePasswordScreen');
}else{
//do something
}
});
} else {
alert('ios url -' + url );
//Linking.addEventListener('url', this.handleOpenURL);
}
}
Вышеуказанная настройка отлично работает с android:launchMode="singleTop"
, но единственная проблема заключается в том, что я не хочу новый экземпляр приложения.
Поэтому я попробовал следующие изменения
Manifest
android:launchMode="singleTask"
При этом существует только один экземпляр, и при нажатии на URL приложение возобновляется.
Поэтому я добавил AppState на страницу, которая возобновляет работу и пытается получить URL, но она не работает.
componentDidMount(){
//this.whereShoulINavigateTo();
AppState.addEventListener('change', this._handleAppStateChange);
}
componentWillUnmount() {
AppState.removeEventListener('change', this._handleAppStateChange);
}
_handleAppStateChange = (nextAppState) => {
if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
console.log('App has come to the foreground!')
this.whereShoulINavigateTo();
}
this.setState({appState: nextAppState});
}
whereShoulINavigateTo = async () => {
if (Platform.OS === 'android') {
Linking.getInitialURL().then( async (url) => {
alert('url - ' + url)
if(url === 'http://abcd/createpassword')
{
this.props.navigation.navigate('CreatePasswordScreen');
}
});
} else {
alert('ios url -' + url );
//Linking.addEventListener('url', this.handleOpenURL);
}
}
Пожалуйста, предложите.
Спасибо R