Как сделать несколько Deep Linking в двух разных действиях без дублирования приложения android - PullRequest
0 голосов
/ 10 июля 2020

Я использую глубокие ссылки, чтобы поделиться своей активной ссылкой на различные приложения, такие как WhatsApp. Проблема в том, что я хочу поделиться двумя разными видами деятельности. Теперь я могу поделиться ими, но если мы предполагаем, что я поделюсь действием A. После нажатия на ссылку я увижу вариант своего приложения, это нормально, и я перейду к действию A.

Но теперь, если Я делюсь с действием Б. Когда я пытаюсь щелкнуть ссылку, мое приложение будет отображаться дважды за один раз, и если я выберу то, что было ранее выбрано с помощью действия A, оно приведет меня к действию A. Это неверно выбор, поэтому запрошенное действие не будет работать.

См. изображения для пояснения, это действие A:

enter image description here

And this is activity B here problem :

введите описание изображения здесь

Как видите, мое приложение приходит в два раза.

Так в чем проблема, есть ли кто-нибудь, кто знает, как решить эту проблему, помогите мне.

это код манифеста:


<!--   1-->
        <activity
            android:name=".FragmanM.MainActivityM" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </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="http"
                    android:host="============"
                    android:pathPrefix="/post" />
            </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="https"
                    android:host="==============="
                    android:pathPrefix="/post" />
            </intent-filter>
        </activity>

<!--    2   -->

        <activity
            android:name=".FragmantA.MainActivityA" >
            <intent-filter >

                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </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="http"
                    android:host="================"
                    android:pathPrefix="/posts" />
            </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="https"
                    android:host="==============="
                    android:pathPrefix="/posts" />
            </intent-filter>
        </activity>

это действие A


Uri data =getActivity(). getIntent().getData();

        if (data!= null) {
            try {
                post_id =  data.getLastPathSegment().toString();
                getPost(post_id);


            } catch (NumberFormatException e) {
                post_id=null;
            }



        }


        Bundle bundle = getActivity().getIntent().getExtras();
        if (bundle !=null){
            if(post_id==null){
                post_id =bundle.getString("mid");


                getPost(post_id);


            }

        }


это действие B



Uri data =getActivity(). getIntent().getData();

        if (data!= null) {
            try {
                posts_id =  data.getLastPathSegment().toString();
                getPost(posts_id);



            } catch (NumberFormatException e) {
                posts_id=null;
            }



        }


        Bundle bundle = getActivity().getIntent().getExtras();
        if (bundle !=null){
            if(posts_id==null){
                posts_id =bundle.getString("moid");
                getPost(posts_id);


            }

        }

1 Ответ

0 голосов
/ 10 июля 2020

Оба ваших действия предоставляют фильтры намерений, но причина этого в том, что вы предоставляете аналогичный префикс пути.

Я имею в виду, что это находится в вашем первом действии, т.е. .FragmanM.MainActivityM вы упомянули

 <data
      android:scheme="http"
      android:host="============"
      android:pathPrefix="/post" /> 

А в .FragmantA.MainActivityA вы написали это

 <data
      android:scheme="http"
      android:host="============"
      android:pathPrefix="/posts" /> 

Теперь взгляните на pathPrefix

По определению и согласно пути в документации Префикс:

Атрибут pathPrefix указывает частичный путь, который сопоставляется только с начальной частью пути в объекте Intent

Поэтому, когда вы сталкиваетесь со ссылками, такими как это: www.yourhost.com/posts первое действие также отображается, а второе также отображается, что ожидается.

Итак, как это исправить?

Метод 1: Вы можете удалите фильтр намерений из вашего второго действия и сделайте одно действие, обрабатывающее оба пути в этом случае .FragmanM.MainActivityM

, а внутри этого действия сделайте отметку onCreate() примерно так

        Uri data = getIntent().getData();
        if(data.getPath().startsWith("/posts"))
        {
            //Start Your second activity here 
        }

Метод 2: Создайте целое n ew activity только для обработки ссылок, а оттуда вы фильтруете ссылки и перемещаете пользователя на разные экраны

...