Назначение служебного Intent-фильтра внутри Manifest.xml

от разработчиков Android: "Компоненты (службы) рекламируют свои возможности - типы намерений, на которые они могут реагировать - через фильтры намерений.

Я просто не могу понять цель фильтра намерения внутри службы в Manifest.xml, какова здесь возможность?

<service
    android:name="com.x.y"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="com.x.y" />
    </intent-filter>
</service>

и чем он отличается, если я удаляю фильтр намерения?

 <service
       android:name="com.x.y"
 </service>

спасибо.

Ответы

Ответ 1

Если вы хотите использовать службу для выполнения разных действий, объявление объявления фильтра намерения поможет вашей службе соответствовать различным действиям, которые вы хотите выполнить.

Пример объяснит лучше.
Предположим, у вас есть следующее объявление в файле манифеста:

<service
    android:name="MyService" >
    <intent-filter>
        <action android:name="com.x.y.DOWNLOAD_DATA" />
        <action android:name="com.x.y.UPLOAD_DATA" />
    </intent-filter>
</service>

Затем в IntentService вы можете отфильтровать эти действия следующим образом:

public class MyService extends IntentService {

    public MyService() {
        super("MyService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if(intent.getAction().equals("com.x.y.DOWNLOAD_DATA"){
            //download data here
        }else if(intent.getAction().equals("com.x.y.UPLOAD_DATA"){
            // upload data here
        }
    }
}

В принципе, он позволяет использовать один и тот же сервис для разных действий, вместо того, чтобы создавать, например, две отдельные службы.

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

Внимание. Чтобы ваше приложение было безопасным, всегда используйте явное намерение при запуске службы и не объявлять фильтры намерений для вашего Сервисы. Использование неявного намерения запуска службы - это безопасность поскольку вы не можете быть уверены в том, какая служба будет реагировать на и пользователь не может видеть, какая служба запускается.

Ответ 2

Вы можете использовать фильтры намерений для явного вызова вашей службы или для того, чтобы ваша служба была неявно вызвана там, где компоненты из любого приложения, установленного на пользовательском устройстве, могут запустить вашу службу

Если вы планируете использовать свой сервис только локально (другие приложения его не используют), вам не нужно (и не должно) предоставлять какие-либо фильтры намерений

Это ясно указано в документации Объявление службы в манифесте