Условно объявляем сервис в AndroidManifest

У меня есть сервис, в частности Android Daydream DreamService, что я заявил в моем AndroidManifest.xml файл. Когда мое приложение загружено, Android обнаруживает это объявление и добавляет мое приложение в качестве опции в список Daydreams, которые пользователь может выбрать в своих настройках. Я объявляю это Service следующее...

<service android:name=".daydream.DaydreamService" android:exported="true"
        android:icon="@drawable/icon" android:label="@string/app_name" >
   <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>

   <meta-data
        android:name="android.service.dream"
        android:resource="@xml/daydream" />

</service>

Я пытаюсь увидеть, есть ли способ, которым я могу условно загрузить это Service декларация программно. Другими словами, я хочу только заявить об этом DreamService основанный на некоторой программной логике. Я не хочу, чтобы Android отображал или даже не знал о функции Daydream моего приложения, если я не включил ее программным способом.

Возможно ли что-то подобное?

2 ответа

Решение

Возможно ли что-то подобное?

Да, это так, даже без жирного шрифта.:-)

Вызов setComponentEnabledSetting() на PackageManager переключать, включен ли компонент. Использовать android:enabled атрибут в манифесте, чтобы указать его начальное состояние, где по умолчанию это то, что он включен.

Итак, вы можете добавить android:enabled="false" на ваше .daydream.DaydreamService компонент, чтобы он был изначально отключен, затем используйте setComponentEnabledSetting() чтобы включить его позже по мере необходимости.

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

<service ...
   android:enabled="@bool/ENABLE_SERVICE">

и тогда в некоторых конфигурациях ENABLE_SERVICE может быть установлено в значение true, а в других - в false (например, если вы хотите, чтобы сервис предоставлялся только на экранах размером с телефон, а не на экранах планшета).

Другие вопросы по тегам