当应用程序被杀死时,Flutter 中的深层链接会在 Android 上打开不同的实例

问题描述 投票:0回答:1

我正在开发一个 Flutter 项目,现在我正在将其配置为使用深度链接。我设法让深度链接在 iOS 上正常工作,但在 Android 上我已经成功了一半。如果应用程序打开或在后台,我可以深度链接到应用程序中的任何屏幕,没有任何问题。但是,如果应用程序被终止并且我尝试深层链接到任何屏幕,则应用程序的行为会处于非常奇怪的状态。首先,它以注销状态打开应用程序(即使我已登录),并且应用程序变得无响应,并且无法发出任何网络请求。

我尝试在网上搜索解决方案,但到目前为止还没有解决问题。以下是我遇到的一些解决方案,但没有帮助:

  1. launchMode
    中的
    AndroidManifest.xml
    更改为
    singleTask
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.hoarsecords.app">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
    <queries>            
        <package android:name="com.instagram.android" />
        <package android:name="com.facebook.katana" />
        <package android:name="com.facebook.orca" />
        <package android:name="org.telegram.messenger" />
        <package android:name="com.whatsapp" />
        <package android:name="com.twitter.android" />
    
        <provider android:authorities="com.facebook.katana.provider.PlatformProvider" /> 
        <provider android:authorities="com.facebook.orca.provider.PlatformProvider" />
    </queries>
    <application
        android:label="@string/app_name"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:allowTaskReparenting="true"
            android:theme="@style/LaunchTheme"
          android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
             <!-- Deep links -->
            <meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
            <intent-filter android:autoVerify="true">
                <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="hoarsecords.com" />
                <data android:scheme="https" />
            </intent-filter>
            <!-- App links -->
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="app" android:host="hoarsecords.com" />
            </intent-filter>
        </activity>
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="@string/provider_name"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        <provider 
            android:name="com.facebook.FacebookContentProvider" 
            android:authorities="@string/facebook_authorities"
            android:exported="true" />
        <meta-data 
            android:name="com.facebook.sdk.ApplicationId" 
            android:value="@string/facebook_app_id" />
        <meta-data 
            android:name="com.facebook.sdk.ClientToken" 
            android:value="@string/facebook_client_token" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_launcher_notification" />
        <activity
            android:name="com.yalantis.ucrop.UCropActivity"
            android:screenOrientation="portrait"
            android:launchMode="singleTask"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
        <activity android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:launchMode="singleTask"
            android:label="@string/app_name" />
        <activity
            android:name="com.facebook.CustomTabActivity"
            android:launchMode="singleTask"
            android:exported="true">
            <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="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
        <meta-data 
            android:name="google_analytics_automatic_screen_reporting_enabled" 
            android:value="false" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/default_notification_channel_id" />
        <service
            android:name="com.dexterous.flutterlocalnotifications.ForegroundService"        
            android:exported="false"
            android:stopWithTask="false"/>
    </application>
</manifest>

  1. 重写
    onNewIntent()
    中的
    MainActivity.kt
    方法:
class MainActivity : FlutterActivity() {

    private val CHANNEL = "app.channel.shared.data"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        handleIntent(intent)
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_VIEW == intent.action && intent.data != null) {
            val data: Uri? = intent.data

            // Revised intent flags
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

            // Process the deep link and send it to Flutter
            if (data != null) {
                handleDeepLink(data)
            }
        }
    }

    private fun handleDeepLink(data: Uri) {
        flutterEngine?.let {
            MethodChannel(it.dartExecutor.binaryMessenger, CHANNEL).invokeMethod("deeplink", data.toString())
        } ?: run {
            // Handle the case where the FlutterEngine is not initialized
        }
    }
}

不幸的是,上述解决方案都不适合我。如果您有如何解决此问题的想法,请告诉我。

android flutter deep-linking android-deep-link flutter-deep-link
1个回答
0
投票

你很好地解释了你的问题,但没有给出背景。

您如何实施深度链接?您正在执行什么程序。

当我第一次在我的 flutter 应用程序中实现深度链接时,我注意到当应用程序打开所需的屏幕时,它在幕后使用 context.go ,这清除了我在启动屏幕中设置的身份验证状态,所以这可能是您也遇到的问题。

© www.soinside.com 2019 - 2024. All rights reserved.