Wenn ein Gerät mehrere Nutzer unterstützt, müssen die zugehörigen Apps auf diese verschiedenen Nutzenden aufmerksam gemacht.
Bei bestimmten Apps müssen einige Komponenten als Singleton ausgeführt werden und dürfen von beliebigen Nutzern. Diese Funktion kann derzeit nur von System-Apps verwendet werden.
Diese Einrichtung:
- Schont Ressourcen
- Schlichtet eine oder mehrere freigegebene Ressourcen für mehrere Nutzer
- Reduziert den Netzwerk-Overhead durch die Nutzung einer einzigen Serververbindung
Das folgende Diagramm zeigt den Berechtigungsfluss bei mehreren Nutzern.
Aktivieren einer Singleton-Komponente
Um eine App als Singleton zu identifizieren, fügen Sie Ihrem Dienst android:singleUser="true"
hinzu.
Empfänger oder Anbieter angeben.
Das System instanziiert diese Komponente in dem Prozess, der als Nutzer 0 ausgeführt wird. . Alle Anfragen zum Herstellen einer Verbindung zu diesem Anbieter oder Dienst oder zum Senden von Nachrichten an diesen Empfänger von jeder Nutzer wird zum Prozess in Nutzer 0 weitergeleitet. Wenn dies die einzige Komponente in Ihrer App ist, wird nur eine Instanz der Anwendung ausgeführt.
Die Aktivitäten in Ihrem Paket werden weiterhin in einem separaten Prozess gestartet, jeden Nutzer, wobei die UID im UID-Bereich des jeweiligen Nutzers liegt (z. B. 1010034).
Mit Nutzern interagieren
Berechtigungen festlegen
Diese Berechtigungen sind erforderlich
INTERACT_ACROSS_USERS (signature|system) INTERACT_ACROSS_USERS_FULL (signature)
APIs einsetzen
Mit den folgenden APIs können Sie Anwendungen auf mehrere Nutzer aufmerksam machen.
- Extrahieren Sie das Nutzer-Handle aus eingehenden Binder-Aufrufen:
<ph type="x-smartling-placeholder">
- </ph>
-
int userHandle = UserHandle.getCallingUserId()
-
- Verwenden Sie neue, geschützte APIs, um Dienste, Aktivitäten und Übertragungen auf einem bestimmten
Nutzer:
<ph type="x-smartling-placeholder">
- </ph>
Context.startActivityAsUser(Intent, UserHandle)
Context.bindServiceAsUser(Intent, …, UserHandle)
Context.sendBroadcastAsUser(Intent, … , UserHandle)
Context.startServiceAsUser(Intent, …, UserHandle)
UserHandle
kann ein expliziter Nutzer oder einer der speziellen Aliasse sein:UserHandle.CURRENT
oderUserHandle.ALL
.CURRENT
gibt an, den Nutzer, der gerade im Vordergrund ausgeführt wird. Verwenden SieALL
, wenn Sie eine Nachricht an alle Nutzer senden. - Mit Komponenten in Ihrer eigenen App kommunizieren:
(INTERACT_ACROSS_USERS)
Oder mit Komponenten in anderen Apps:(INTERACT_ACROSS_USERS_FULL)
- Möglicherweise müssen Sie Proxy-Komponenten erstellen, die im Prozess des Nutzers ausgeführt werden,
Greifen Sie dann auf die Komponente „
singleUser
“ in Nutzer 0 zu. - Frage Nutzer und ihre Aliasse mit dem neuen
UserManager
-Systemdienst ab: <ph type="x-smartling-placeholder">- </ph>
UserManager.getUsers()
UserManager.getUserInfo()
UserManager.supportsMultipleUsers()
UserManager.getUserSerialNumber(int userHandle)
: eine nicht wiederverwendete Zahl, die einem Nutzer-Alias entspricht.UserManager.getUserHandle(int serialNumber)
UserManager.getUserProfiles()
: gibt die Sammlung der eigenen Profile und der verwalteten Profile (sofern vorhanden) zurück.
- Registrieren Sie sich, um bestimmte oder alle Nutzer und die Callbacks mit neuen APIs auf ContentObserver, PackageMonitor und BroadcastReceiver, Informationen darüber, welcher Nutzer den Rückruf veranlasst hat.
Dienste in mehreren Nutzern oder Profilen
Nicht alle Dienste müssen eine Instanz in einem anderen Nutzer- oder Arbeitsprofil ausführen. Wenn Ihr Systemdienst nur als Nutzer 0 ausgeführt werden muss, deaktivieren Sie die Dienstkomponenten, wenn sie unter anderen Nutzern ausgeführt werden. Ressourcen zu schonen. Das folgende Beispiel zeigt, wie Sie dies am Eintrag Ihres Dienstes tun können. Punkte:
// Add on all entry points such as boot_completed or other manifest-listed receivers and providers if (!UserManager.isSystemUser()) { // Disable the service ComponentName targetServiceName = new ComponentName(this, TargetService.class); context.getPackageManager().setComponentEnabledSetting( targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0); }
In diesem Beispiel könnte mit PackageManager.setApplicationEnabledSetting()
auch Folgendes deaktiviert werden:
die gesamte App nutzen.