Android深层链接意图问题

时间:2018-10-08 06:20:52

标签: android android-intent deep-linking intentfilter android-deep-link

我正在尝试在我的应用程序中实现深层链接,我在主要活动的onResume方法中添加了getIntent,并且能够从该链接打开主要活动,但是我面临以下问题。

  1. 如果我第一次单击应用程序图标来打开应用程序,则意图操作将为Intent.ACTION_MAIN,这对于所有后续尝试都是恒定的,即当我通过链接,则该intent.action应该是Intent.ACTION_VIEW,但该操作始终是ACTION_MAIN。

  2. 如果通过chrome中的链接打开了该应用程序,那么我可以看到我的应用程序的两个实例,即chrome上方和我的应用程序本身。

    <activity
        android:name=".MainActivity"
        android:hardwareAccelerated="false"
        android:launchMode="singleTop"> // I used singleTop because i have implementd isTaskRoot in my main activity
        <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:host="clip.myapp.tp"
                android:pathPattern="/.*"
                android:scheme="mhhds" />
        </intent-filter>
    </activity>
    

下面是我实现了getIntent的我的mainactivity.java文件的onResume

     @Override
    protected void onResume() {

    super.onResume();


    mIntent = getIntent();

    String appLinkAction = mIntent.getAction();
    if(mIntent.getAction().equals(Intent.ACTION_VIEW)) {

        Uri data = mIntent.getData();
        String mIntentData = data.toString();

        System.out.println("Intentdata:" + mIntentData);
    }
    }

1 个答案:

答案 0 :(得分:1)

这是因为singleTop不会创建新的活动实例,而总是使用现有活动实例

  

如果我是第一次点击应用程序图标打开应用程序,   那么intent操作将为Intent.ACTION_MAIN,这将是   所有后续尝试的常量,即当我通过   链接,则intent.action应该是Intent.ACTION_VIEW,但是   操作始终为ACTION_MAIN。

由于上述原因,getIntent将返回第一次收到的实例,而不是覆盖onNewIntent,这将返回最新意图的实例,因此请使用onNewItent而不是{{1 }}

  

如果通过chrome中的链接打开了应用程序,那么我可以看到两个   我的应用实例,即chrome和我的应用本身

这是因为您的应用程序以前是作为独立应用程序打开的(现在已在堆栈历史记录中),现在已作为搜索结果在chrome中打开,因此这是正常行为。