Что это значит, когда два или более действия, каждое из которых имеет фильтр намерений с action=android.intent.action.ACTION_MAIN?

Документ говорит https://developer.android.com/reference/android/content/Intent.html#ACTION_MAIN — это точка входа.

Пример кода:

 <activity android:name="org.A.A"
            android:theme="@style/NoTitle"
            android:screenOrientation="behind"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity android:name="org.A.C"
            android:theme="@style/NoTitle"
            android:launchMode="singleTop"
            android:screenOrientation="behind">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity android:name="org.A.B"
            android:theme="@style/NoTitle"
            android:launchMode="singleTop"
            android:screenOrientation="behind">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

1) Таким образом, использование android.intent.action.ACTION_MAIN действует как точка входа в родительский компонент (родительский компонент, я имею в виду действие, получатель или службу)?

2) Если да, точка входа откуда, поскольку КАТЕГОРИЯ не упоминается.


person sofs1    schedule 07.01.2017    source источник


Ответы (2)


Приложения для Android состоят из разных компонентов. например Activity, Service, BroadcastReceiver и ContentProvider, и каждый компонент может действовать как точка входа в приложение.

Возьмем в качестве примера активность. Вы определили активность в своем приложении со следующим действием.

<intent-filter>
     <action android:name="com.yourapp.SOME_ACTION" />
     <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

и я начинаю действие в приложении my со следующим намерением.

Intent intent = new Intent("com.yourapp.SOME_ACTION"); // same action
startActivity(intent);

Что теперь будет? Система будет искать действия с действием com.yourapp.SOME_ACTION и если найдет (в текущем сценарии это будет действие, которое вы создали с помощью com.yourapp.SOME_ACTION в своем приложении), она запустит ваше приложение (если оно еще не запущен) и откроет активность в вашем приложении.

Видите, теперь я могу войти в ваше приложение, используя Activity с com.yourapp.SOME_ACTION. То же самое происходит и в случае с другими компонентами.

person mallaudin    schedule 07.01.2017
comment
Спасибо за ответы. ....и каждый компонент может действовать как точка входа приложения. - Означает ли это, что каждый компонент может действовать как точка входа в приложение извне? - person sofs1; 07.01.2017
comment
Да. Это правда. - person mallaudin; 07.01.2017
comment
В вашем примере с фильтром намерений я заметил, что вы использовали категорию. Но мой вопрос 2) и код, который я дал, не имеет категории, кроме action_MAIN во всех действиях в рамках одного AndroidManifest.xml. - person sofs1; 07.01.2017
comment
Это связано с тем, что я использую неявное намерение для открытия активности, а для неявных намерений требуется категория по умолчанию. - person mallaudin; 07.01.2017
comment
Пожалуйста, пройдите через developer.android.com/guide/components/intents-filters.html и stackoverflow.com/questions/5727828/ - person mallaudin; 07.01.2017
comment
Если вы не добавляете категорию по умолчанию, это означает, что вы не разрешаете открывать свою активность неявными намерениями. - person mallaudin; 07.01.2017
comment
Идеальное время. :) Я читал эти две ссылки. Хорошо, вот мой вопрос. Код, который я поставил под сомнение, взят из проекта с открытым исходным кодом. Я пытаюсь понять, что он делает. Я понял, что такое категория по умолчанию, неявное намерение и действие. Но я не мог понять, какова цель этих трех действий с фильтром намерений ACTION_MAIN, но без категории. - person sofs1; 07.01.2017
comment
Приложение будет использовать эти действия в приложении. Если вам нужно начать деятельность, вы должны сделать это намеренно. Для запуска этих действий вы можете использовать явное намерение. нравится Intent intent = new Intent(context,org.A.C.class); - person mallaudin; 07.01.2017

Действие с ГЛАВНЫМ действием будет точкой входа в приложение. Если у вас есть одно, это хорошо, если их несколько, то у вас может быть несколько действий, через которые вы можете войти в приложение.

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

Но если вы предоставили CATEGORY для активности, он создаст пусковую установку для этой точки входа.

       <category android:name="android.intent.category.LAUNCHER" />

Предположим, что у двух действий есть как ОСНОВНОЕ действие, так и КАТЕГОРИЯ, так как будет создано два значка приложения запуска, одно будет иметь одно действие в качестве точки входа, второе будет иметь другое в качестве точки входа.

    <intent-filter>
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
person santosh kumar    schedule 07.01.2017