从应用程序链接启动活动时,intent.data为null

时间:2018-06-26 19:58:15

标签: android null intentfilter applinks

我查看了相关的SO,但他们似乎并未解决此问题。

该应用程序支持应用程序链接,并且网站具有.well-known / assetlinks.json。

点击电子邮件中的应用链接时,说https://staging.xyz.com/v3/info/7vwD2yjW

  • 应显示主要活动
  • onCreate()应该从intent.data获取URI数据
  • 主要活动应基于URI数据进行自我更新

从冷启动具有有效应用程序链接的应用程序开始,intent.data始终为null。但是,如果应用程序已在运行或在后台运行,则URI intent.data在onNewIntent()中不为null,并且可以正常工作。

不确定我缺少什么。它在运行Android 7.0的Galaxy J3 Prime上运行。这是配置。有什么想法如何从冷启动获取intent.data URI?

    <activity
        android:name=".activity.MainActivity"
        android:launchMode="singleInstance"
        android:screenOrientation="portrait">
        <tools:validation testUrl="https://staging.xyz.com/v3/info/7vwD2yjW" />

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <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="https"
                android:host="xyz.com"
                android:pathPattern="/.*/share" />
        </intent-filter>

        <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="https"
                android:host="xyz.com"
                android:pathPattern="/.*/info/.*" />
        </intent-filter>

        <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="https"
                android:host="*.xyz.com"
                android:pathPattern="/.*/share" />
        </intent-filter>

        <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="https"
                android:host="*.xyz.com"
                android:pathPattern="/.*/info/.*" />
        </intent-filter>

3 个答案:

答案 0 :(得分:0)

尝试将android:launchMode="singleInstance"更改为android:launchMode="singleTask"

答案 1 :(得分:0)

原来是这样工作的。在其他地方有一个例外,导致启动活动跳过了从URI数据的更新。发布解决方案,以防其他人使用。

要追踪,我是在Android Studio中通过应用链接冷启动期间将调试器附加到设备进程的,如下所示:

adb shell am set-debug-app -w --persistent com.xyz.appname
adb shell am start -a android.intent.action.VIEW -d "https://staging.xyz.com/v3/info/7vwD2yjW" com.xyz.appname

然后运行->调试->选择带有链接的调试配置

进行一个API调用,并在启动活动中显示带有繁忙指示器的PopupWindow。弹出窗口抛出异常:

BadTokenException: Unable to add window -- token null is not valid; is your activity running?

要使弹出窗口正常工作,请在活动启动周期完成后在onCreate()中显示弹出窗口

activityRootView.post {
  handleAppLinkIntent(intent) // show busy popup and do stuff with intent.data
}

答案 2 :(得分:0)

查看此question。您应该重写onNewIntent,然后从中处理数据。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // do stuff with intent
}