Как заставить мою службу работать только в одном экземпляре в многопользовательской системе Android?

Наша система Android поддерживает несколько пользовательских функций. Я хочу запустить свой сервер из других приложений, например app1, app2, с помощью команды startService (intent). В документе Google по адресу https://source.android.com/devices/tech/admin/multiuser-apps.html. Мне нужно установить android: singleUser = "true", чтобы моя служба работала только в одном экземпляре в многопользовательской системе Android. но когда я запускаю обслуживание в другом приложении, у меня возникает исключение ниже:

Not allowed to start service Intent { act=com.xx.xxx.action.Start pkg=com.xx.xxx (has extras) } without permission not exported from uid 1000

казалось, что android: exported = "true" отключен android: singleUser = "true". если бы я не добавил android: singleUser = "true", он работал нормально, но в фоновом режиме работает несколько экземпляров моей службы. У меня вопрос: как сделать так, чтобы моя служба работала только в одном экземпляре с startService (intent) из других приложений? Мой Manifest.xml настроен следующим образом:

    <application
        android:name=".App"
        android:label="@string/app_name"
        android:directBootAware="true"
        android:multiprocess="false"
        android:persistent="true">
        <service
            android:name=".MyService"
            android:singleUser="true"
            android:exported="true"
            android:permission="com.xx.permission.xx">
            <intent-filter>
                <action android:name="com.xx.xx.action.xx" />
            </intent-filter>
        </service>
</Application>

Огромное спасибо.


person user3034559    schedule 28.03.2017    source источник


Ответы (4)


Как указано в документации, которую вы связали, «только системные приложения в настоящее время могут использовать эту функцию». Если это возможно для вашего продукта, сделайте ваше приложение системным.

person Hermit    schedule 29.04.2017

Да, необходимо объявить приложение системным. также используйте bindServiceAsUser () с System UserHandler.

person user3034559    schedule 02.05.2017

  1. сделать android: exported и android: singleUser равным true
  2. добавить разрешение INTERACT_ACROSS_USERS
  3. убедитесь, что ваше приложение является привилегированным. поэтому вы должны сделать свою подпись системы приложения
person phstudio    schedule 28.12.2017

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

person iceman_w    schedule 04.02.2019