Apps für mehrere Nutzer erstellen

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.

Ablauf für Berechtigungen mehrerer Nutzer

Abbildung 1: Berechtigungen für mehrere Nutzer

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.

  1. Extrahieren Sie das Nutzer-Handle aus eingehenden Binder-Aufrufen: <ph type="x-smartling-placeholder">
      </ph>
    • int userHandle = UserHandle.getCallingUserId()
  2. 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 oder UserHandle.ALL. CURRENT gibt an, den Nutzer, der gerade im Vordergrund ausgeführt wird. Verwenden Sie ALL, wenn Sie eine Nachricht an alle Nutzer senden.
  3. Mit Komponenten in Ihrer eigenen App kommunizieren: (INTERACT_ACROSS_USERS) Oder mit Komponenten in anderen Apps: (INTERACT_ACROSS_USERS_FULL)
  4. 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.
  5. 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.
  6. 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.