Zugriff auf UI-Thread-Handler von einem Dienst

Ich versuche etwas Neues auf Android, für das ich auf den Handler des UI-Threads zugreifen muss.

Ich kenne folgendes:

  • Ermitteln Sie eine neue Android-Benachrichtigung
  • Android Webview: Gibt es eine Möglichkeit zu wissen, was die vorherige URL ist?
  • ActionBarDrawerToggle v7 oder v4?
  • Blauer Punkt und Kreis wird nicht auf MyLocation mit android fused location api angezeigt
  • Wie deaktiviere ich die Autoscroll-Funktion in Logcat?
  • Überprüfen, ob eine Android-Anwendung im Hintergrund läuft
    1. Der UI-Thread hat seinen eigenen Handler und Looper
    2. Jede Nachricht wird in die Nachrichtenwarteschlange des UI-Threads gesetzt
    3. Der Looper nimmt die Veranstaltung auf und übergibt sie an den Handler
    4. Der Handler behandelt die Nachricht und sendet das specfic-Ereignis an die Benutzeroberfläche

    Ich möchte meinen Service haben, der den UI-Thread-Handler bekommen muss und eine Nachricht in diesen Handler stellen muss. Damit diese Nachricht verarbeitet und an die Benutzeroberfläche ausgegeben wird. Hier wird der Service ein normaler Service sein, der von einer Anwendung gestartet wird.

    Ich würde gerne wissen, ob das möglich ist. Wenn ja, bitte schlagen Sie einige Code-Snippets, damit ich es ausprobieren kann.

    Grüße Girish

  • Testen endloses Scrollen RecyclerView mit Espresso und RxJava
  • ProgressBar nicht animieren beim Aufblasen von Viewstub
  • Webview wird zum ersten Mal nicht geladen
  • Programmalisch manifestieren - Android benutzerdefinierte Berechtigungen
  • AlarmManager funktioniert nicht
  • Löschen Sie Benutzerdaten oder löschen Sie den Cache auf Phonegap android
  • 4 Solutions collect form web for “Zugriff auf UI-Thread-Handler von einem Dienst”

    Dieses Snippet von Code konstruiert einen Handler, der mit dem Haupt- (UI) Thread verbunden ist:

    Handler handler = new Handler(Looper.getMainLooper()); 

    Sie können dann Sachen für die Ausführung in der main (UI) Thread wie folgt:

     handler.post(runnable_to_call_from_main_thread); 

    Wenn der Handler selbst aus dem Haupt- (UI) Thread erstellt wird, kann das Argument zur Kürze weggelassen werden:

     Handler handler = new Handler(); 

    Die Android Dev Guide auf Prozesse und Threads hat mehr Informationen.

    Erstellen Sie ein Messenger Objekt, das an Ihren Handler angehängt ist, und übergeben Sie diesen Messenger an den Service (zB in einem Intent extra für startService() ). Der Service kann dann über den Messenger eine Message an den Handler senden. Hier ist eine Beispielanwendung, die dies demonstriert.

    Im Moment bevorzuge ich die Veranstaltung Bus-Bibliothek wie Otto für diese Art von Problem. Einfach die gewünschten Komponenten abonnieren (Aktivität):

     protected void onResume() { super.onResume(); bus.register(this); } 

    Geben Sie dann eine Rückrufmethode an:

     public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. } 

    Und dann, wenn Ihr Service eine Anweisung wie folgt ausführt:

     bus.post(new TimeLeftEvent(340)); 

    Dieser POJO wird an Ihre oben genannte Aktivität und alle anderen abonnierenden Komponenten weitergegeben. Einfach und elegant.

    Sie können Werte durch Broadcast-Empfänger erhalten …… wie folgt: Zuerst erstellen Sie Ihre eigenen IntentFilter als,

     Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER"); 

    Dann schaffen innere Klasse BroadcastReceiver als,

      private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { /** Receives the broadcast that has been fired */ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; 

    Jetzt registriere deinen Broadcast-Receiver in onResume () als,

     registerReceiver(broadcastReceiver, intentFilter); 

    Und endlich Unregister BroadcastReceiver in onDestroy () als,

     unregisterReceiver(broadcastReceiver); 

    Jetzt der wichtigste Teil … Du musst die Sendung von wo immer du brauchst, um Werte zu senden ….. so tue,

     Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i); 

    ….Prost 🙂

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.