1

Ich lerne über Android-App-Entwicklung für Multi-Profile-Szenarien und erstellt einen einfachen Dienst, der eine Toast-Nachricht alle paar Sekunden anzeigt. Der Service ruft startForeground.Toast/Benachrichtigung in einem beliebigen Benutzerprofil von einem Dienst anzeigen

Wie erwartet werden die Toastnachrichten angezeigt und eine Benachrichtigung (erforderlich von startForeground) wird in der Benachrichtigungsleiste angezeigt.

Update: Der Toast wird gezeigt, einen Handler mit, nach dem gleichen Ansatz wie in den Antworten wurde empfohlen:

Handler handler =new Handler(); 
handler.post(new Runnable() { 
public void run() { 
    Toast.makeText(applicationContext, "hi", Toast.LENGTH_LONG).show() 
} 

});

Wenn jedoch auf einem anderen Benutzerprofil Protokollierung:

  • die Benachrichtigung nicht mehr vorhanden ist in der Benachrichtigungsleiste und
  • die Toasten nicht mehr erscheinen.

Ich weiß, dass der Dienst noch ausgeführt wird, wie es zur Ausgabe von Log-Meldungen (adb logcat) weiter, und es gibt keine Fehlermeldungen, die diesen Aufruf anzeigen würde der Toast angezeigt versagt:

Ich habe versucht, programmatisch Stoppen und erneutes Starten des Dienstes nach dem Einloggen auf das neue Benutzerprofil, aber ohne Glück. Wenn die Anwendung in dem neuen Benutzerprofil manuell neu gestartet wird, erscheinen die Toastnachrichten und die Benachrichtigung do.

Dies ist keine Systemanwendung, daher erfordert eine Lösung, dass die Berechtigungen für Systemanwendungen nicht akzeptiert werden.

Kann ein Dienst Toastnachrichten von einem Dienst anzeigen, unabhängig vom aktuellen Benutzerprofil?

+0

Sie __Handler__ oder __Broadcast verwenden sollten Receiver__, um Ihre Benutzeroberfläche zu aktualisieren. – Piyush

+0

Danke @ Piyush Gupta. Ich benutze Handler (aktualisiert die Frage, um das zu reflektieren.) So konnte ich die Toasts aus dem ersten Benutzerprofil anzeigen. Es funktioniert gut, aber wenn Sie zum zweiten Profil wechseln, erscheinen die Toasts nicht mehr. –

Antwort

0

Sie können Toast nicht vom Dienst anzeigen. Nur UI-Threads können UI-bezogene Dinge tun, und Toast ist auch UI. Details finden Sie unter Communicating with the UI Thread.

Sie diesen Ansatz versuchen:

zu Ihren Diensten hinzufügen:

protected Handler mHandler = new Handler(); 

und dann müssen Sie die Runnable schreiben Toast zeigen:

mHandler.post(new Runnable() { 
    public void run() { 
     Toast.makeText(applicationContext, "hi", Toast.LENGTH_LONG).show() 
    } 
}); 
+0

Danke Marcin, ich mache es genau so und habe die Frage aktualisiert, um das klarzustellen. Das Problem besteht darin, dass die Toasts beim Wechseln zu einem anderen Profil nicht mehr angezeigt werden (Toasts werden angezeigt), wenn das Benutzerprofil die App gestartet hat. Kann dieser Code so geändert werden, dass die Toasts über Profile hinweg angezeigt werden, oder gibt es einen besseren Weg? –