English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lösungsmethode für das Problem, dass Toast in Android Service nicht normal angezeigt wird

Dieser Artikel beschreibt die Lösung für das Problem, dass Toast in Android Services nicht korrekt angezeigt wird. Hiermit teile ich es mit Ihnen zur Verfügung, wie folgt:

Bei einfachen Übungen mit Services wurde Toast.makeText in den Methoden onCreate, onStart und onDestroy im Service so wie in den Methoden im Activity aufgerufen, und in der Activity wurden zwei Buttons verwendet, um die Methoden onStart und onDestroy des Dienstes aufzurufen:

Der Code des DemoService ist wie folgt:

@Override
public void onCreate()
{
    super.onCreate();
    Toast.makeText(getApplicationContext(), "Service is created!", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startId)
{
    super.onStart(intent, startId);
    Toast.makeText(getApplicationContext(), "Service is on!", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy(){
    super.onDestroy();
    Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show();
}

Nach dem Start wurden keine Informationen im DemoService angezeigt.

Zunächst wurde angenommen, dass der获得的Context nicht korrekt ist, da getApplicationContext() direkt im Service aufgerufen wird, der den Context des Services zurückgibt. Aber wenn man genauer hinschaut, sollte Toast den Context der Haupt-UI erhalten, um angezeigt zu werden. Daher habe ich ein bisschen gesucht und in der Dokumentation von Google zu Toast fand ich einen Satz:

“Ein Toast kann von einer Activity oder einem Service erstellt und angezeigt werden. Wenn Sie eine Toast-Benachrichtigung von einem Service erstellen, wird sie vor der Activity im Fokus angezeigt.”
(http://developer.Android.com/guide/topics/ui/notifiers/toasts.html)

Wenn man nach diesem Satz geht, wird der Toast, der im Service erstellt wird, vor dem UI der Activity im Fokus angezeigt. Warum hat es aber keine Wirkung? Sehen wir uns die Methode makeText noch einmal an.

Natürlich ist es das Context-Problem, daher muss der Toast normal funktionieren, indem er auf dem Hauptthread der Activity ausgeführt wird. Wie kann man den Context der Hauptthread-UI erhalten? Man kann einen benutzerdefinierten Thread über einen Handler auf dem Hauptthread ausführen.

Sehen wir uns noch einmal den src der Methode Toast.show an:

public void show() {
    ...
    service.enqueueToast(pkg, tn, mDuration);  //Fügen Sie diesen Toast in eine Nachrichtenliste ein
    ...
}

In der Theorie ist Android im Großen und Ganzen eine Nachrichtenliste und Nachrichtenwiederholung, die Hauptthread Nachrichten von der Nachrichtenliste abruft und verarbeitet. Der Handler wird als ein Werkzeugklasse betrachtet, um Nachrichten in die Nachrichtenliste einzufügen. Daher haben wir den ursprünglichen Code neu strukturiert:

@Override
public void onCreate()
{
    super.onCreate();
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "Service is created!", Toast.LENGTH_LONG).show();
      }
    });
}
@Override
public void onStart(Intent intent, int startId)
{
    super.onStart(intent, startId);
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "Service is on!", Toast.LENGTH_LONG).show();
      }
    });
}
@Override
public void onDestroy(){
    super.onDestroy();
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show();
      }
    });
}

Das Ergebnis nach dem Ausführen ist wie folgt:

Zusammenfassung:Um Toast in Android-Frameworks korrekt zu verwenden, muss Toast in den Hauptthread hinzugefügt werden, um normal zu funktionieren.

Interessierte Leser, die mehr über Android-Inhalte erfahren möchten, können die Themen dieser Website überprüfen: "Einführung und Fortgeschrittene Android-Entwicklung", "Zusammenfassung der Techniken der Android-Ansicht View", "Zusammenfassung der Techniken der activity-Operation in Android", "Zusammenfassung der Techniken der SQLite-Datenbankoperation in Android", "Zusammenfassung der Techniken der json-Format-Datenoperation in Android", "Zusammenfassung der Techniken der Datenbankoperation in Android", "Zusammenfassung der Techniken der Dateioperation in Android", "Zusammenfassung der Methoden der SD-Karte in der Android-Programmierung", "Zusammenfassung der Techniken der Ressourcenoperation in Android" und "Zusammenfassung der Verwendung der Android-Kontrollen"

Wir hoffen, dass die in diesem Artikel beschriebenen Inhalte für die Android-Programmierung von Vorteil sind.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrecht des Urhebers. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Diese Website übernimmt keine Haftung für rechtliche Probleme. Wenn Sie Inhalte mit urheberrechtlichen Bedenken finden, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine Meldung senden, und fügen Sie relevante Beweise bei. Sobald die Inhalte nachgewiesen werden, wird diese Website die beanstandeten Inhalte sofort löschen.)

Gefällt mir