Esempio: comunicazione tra attività e servizio tramite messaggistica


584

Non sono riuscito a trovare esempi di come inviare messaggi tra un'attività e un servizio e ho trascorso troppe ore a capirlo. Ecco un esempio di progetto a cui altri possono fare riferimento.

Questo esempio consente di avviare o interrompere direttamente un servizio e di separare / separare separatamente il servizio. Quando il servizio è in esecuzione, incrementa un numero a 10 Hz. Se l'attività è associata a Service, verrà visualizzato il valore corrente. I dati vengono trasferiti come numero intero e come stringa in modo da poter vedere come farlo in due modi diversi. Ci sono anche pulsanti nell'attività per inviare messaggi al servizio (cambia il valore incrementale per).

Immagine dello schermo:

Schermata dell'esempio di messaggistica del servizio Android

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.exampleservice"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <service android:name=".MyService"></service>
    </application>
    <uses-sdk android:minSdkVersion="8" />
</manifest>

res \ Valori \ strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">ExampleService</string>
    <string name="service_started">Example Service started</string>
    <string name="service_label">Example Service Label</string>
</resources>

res \ layout \ main.xml:

<RelativeLayout
    android:id="@+id/RelativeLayout01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Service" >
    </Button>

    <Button
        android:id="@+id/btnStop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="Stop Service" >
    </Button>
</RelativeLayout>

<RelativeLayout
    android:id="@+id/RelativeLayout02"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <Button
        android:id="@+id/btnBind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Bind to Service" >
    </Button>

    <Button
        android:id="@+id/btnUnbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="Unbind from Service" >
    </Button>
</RelativeLayout>

<TextView
    android:id="@+id/textStatus"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Status Goes Here"
    android:textSize="24sp" />

<TextView
    android:id="@+id/textIntValue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Integer Value Goes Here"
    android:textSize="24sp" />

<TextView
    android:id="@+id/textStrValue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="String Value Goes Here"
    android:textSize="24sp" />

<RelativeLayout
    android:id="@+id/RelativeLayout03"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <Button
        android:id="@+id/btnUpby1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Increment by 1" >
    </Button>

    <Button
        android:id="@+id/btnUpby10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="Increment by 10" >
    </Button>
</RelativeLayout>

src \ com.exampleservice \ MainActivity.java:

package com.exampleservice;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    Button btnStart, btnStop, btnBind, btnUnbind, btnUpby1, btnUpby10;
    TextView textStatus, textIntValue, textStrValue;
    Messenger mService = null;
    boolean mIsBound;
    final Messenger mMessenger = new Messenger(new IncomingHandler());

    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MyService.MSG_SET_INT_VALUE:
                textIntValue.setText("Int Message: " + msg.arg1);
                break;
            case MyService.MSG_SET_STRING_VALUE:
                String str1 = msg.getData().getString("str1");
                textStrValue.setText("Str Message: " + str1);
                break;
            default:
                super.handleMessage(msg);
            }
        }
    }
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mService = new Messenger(service);
            textStatus.setText("Attached.");
            try {
                Message msg = Message.obtain(null, MyService.MSG_REGISTER_CLIENT);
                msg.replyTo = mMessenger;
                mService.send(msg);
            }
            catch (RemoteException e) {
                // In this case the service has crashed before we could even do anything with it
            }
        }

        public void onServiceDisconnected(ComponentName className) {
            // This is called when the connection with the service has been unexpectedly disconnected - process crashed.
            mService = null;
            textStatus.setText("Disconnected.");
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnStart = (Button)findViewById(R.id.btnStart);
        btnStop = (Button)findViewById(R.id.btnStop);
        btnBind = (Button)findViewById(R.id.btnBind);
        btnUnbind = (Button)findViewById(R.id.btnUnbind);
        textStatus = (TextView)findViewById(R.id.textStatus);
        textIntValue = (TextView)findViewById(R.id.textIntValue);
        textStrValue = (TextView)findViewById(R.id.textStrValue);
        btnUpby1 = (Button)findViewById(R.id.btnUpby1);
        btnUpby10 = (Button)findViewById(R.id.btnUpby10);

        btnStart.setOnClickListener(btnStartListener);
        btnStop.setOnClickListener(btnStopListener);
        btnBind.setOnClickListener(btnBindListener);
        btnUnbind.setOnClickListener(btnUnbindListener);
        btnUpby1.setOnClickListener(btnUpby1Listener);
        btnUpby10.setOnClickListener(btnUpby10Listener);

        restoreMe(savedInstanceState);

        CheckIfServiceIsRunning();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("textStatus", textStatus.getText().toString());
        outState.putString("textIntValue", textIntValue.getText().toString());
        outState.putString("textStrValue", textStrValue.getText().toString());
    }
    private void restoreMe(Bundle state) {
        if (state!=null) {
            textStatus.setText(state.getString("textStatus"));
            textIntValue.setText(state.getString("textIntValue"));
            textStrValue.setText(state.getString("textStrValue"));
        }
    }
    private void CheckIfServiceIsRunning() {
        //If the service is running when the activity starts, we want to automatically bind to it.
        if (MyService.isRunning()) {
            doBindService();
        }
    }

    private OnClickListener btnStartListener = new OnClickListener() {
        public void onClick(View v){
            startService(new Intent(MainActivity.this, MyService.class));
        }
    };
    private OnClickListener btnStopListener = new OnClickListener() {
        public void onClick(View v){
            doUnbindService();
            stopService(new Intent(MainActivity.this, MyService.class));
        }
    };
    private OnClickListener btnBindListener = new OnClickListener() {
        public void onClick(View v){
            doBindService();
        }
    };
    private OnClickListener btnUnbindListener = new OnClickListener() {
        public void onClick(View v){
            doUnbindService();
        }
    };
    private OnClickListener btnUpby1Listener = new OnClickListener() {
        public void onClick(View v){
            sendMessageToService(1);
        }
    };
    private OnClickListener btnUpby10Listener = new OnClickListener() {
        public void onClick(View v){
            sendMessageToService(10);
        }
    };
    private void sendMessageToService(int intvaluetosend) {
        if (mIsBound) {
            if (mService != null) {
                try {
                    Message msg = Message.obtain(null, MyService.MSG_SET_INT_VALUE, intvaluetosend, 0);
                    msg.replyTo = mMessenger;
                    mService.send(msg);
                }
                catch (RemoteException e) {
                }
            }
        }
    }


    void doBindService() {
        bindService(new Intent(this, MyService.class), mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
        textStatus.setText("Binding.");
    }
    void doUnbindService() {
        if (mIsBound) {
            // If we have received the service, and hence registered with it, then now is the time to unregister.
            if (mService != null) {
                try {
                    Message msg = Message.obtain(null, MyService.MSG_UNREGISTER_CLIENT);
                    msg.replyTo = mMessenger;
                    mService.send(msg);
                }
                catch (RemoteException e) {
                    // There is nothing special we need to do if the service has crashed.
                }
            }
            // Detach our existing connection.
            unbindService(mConnection);
            mIsBound = false;
            textStatus.setText("Unbinding.");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            doUnbindService();
        }
        catch (Throwable t) {
            Log.e("MainActivity", "Failed to unbind from the service", t);
        }
    }
}

src \ com.exampleservice \ MyService.java:

package com.exampleservice;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class MyService extends Service {
    private NotificationManager nm;
    private Timer timer = new Timer();
    private int counter = 0, incrementby = 1;
    private static boolean isRunning = false;

    ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients.
    int mValue = 0; // Holds last value set by a client.
    static final int MSG_REGISTER_CLIENT = 1;
    static final int MSG_UNREGISTER_CLIENT = 2;
    static final int MSG_SET_INT_VALUE = 3;
    static final int MSG_SET_STRING_VALUE = 4;
    final Messenger mMessenger = new Messenger(new IncomingHandler()); // Target we publish for clients to send messages to IncomingHandler.


    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }
    class IncomingHandler extends Handler { // Handler of incoming messages from clients.
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MSG_REGISTER_CLIENT:
                mClients.add(msg.replyTo);
                break;
            case MSG_UNREGISTER_CLIENT:
                mClients.remove(msg.replyTo);
                break;
            case MSG_SET_INT_VALUE:
                incrementby = msg.arg1;
                break;
            default:
                super.handleMessage(msg);
            }
        }
    }
    private void sendMessageToUI(int intvaluetosend) {
        for (int i=mClients.size()-1; i>=0; i--) {
            try {
                // Send data as an Integer
                mClients.get(i).send(Message.obtain(null, MSG_SET_INT_VALUE, intvaluetosend, 0));

                //Send data as a String
                Bundle b = new Bundle();
                b.putString("str1", "ab" + intvaluetosend + "cd");
                Message msg = Message.obtain(null, MSG_SET_STRING_VALUE);
                msg.setData(b);
                mClients.get(i).send(msg);

            }
            catch (RemoteException e) {
                // The client is dead. Remove it from the list; we are going through the list from back to front so this is safe to do inside the loop.
                mClients.remove(i);
            }
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("MyService", "Service Started.");
        showNotification();
        timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 0, 100L);
        isRunning = true;
    }
    private void showNotification() {
        nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        // In this sample, we'll use the same text for the ticker and the expanded notification
        CharSequence text = getText(R.string.service_started);
        // Set the icon, scrolling text and timestamp
        Notification notification = new Notification(R.drawable.icon, text, System.currentTimeMillis());
        // The PendingIntent to launch our activity if the user selects this notification
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
        // Set the info for the views that show in the notification panel.
        notification.setLatestEventInfo(this, getText(R.string.service_label), text, contentIntent);
        // Send the notification.
        // We use a layout id because it is a unique number.  We use it later to cancel.
        nm.notify(R.string.service_started, notification);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("MyService", "Received start id " + startId + ": " + intent);
        return START_STICKY; // run until explicitly stopped.
    }

    public static boolean isRunning()
    {
        return isRunning;
    }


    private void onTimerTick() {
        Log.i("TimerTick", "Timer doing work." + counter);
        try {
            counter += incrementby;
            sendMessageToUI(counter);

        }
        catch (Throwable t) { //you should always ultimately catch all exceptions in timer tasks.
            Log.e("TimerTick", "Timer Tick Failed.", t);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (timer != null) {timer.cancel();}
        counter=0;
        nm.cancel(R.string.service_started); // Cancel the persistent notification.
        Log.i("MyService", "Service Stopped.");
        isRunning = false;
    }
}

53
Ottimo esempio! Un'altra caratteristica interessante: se aggiungi l' android:process=:myservicenameattributo al servicetag del tuo servizio nel tuo manifest.xml, come:, <service android:name="sname" android:process=":myservicename" />allora eseguirà il tuo servizio come un processo diverso, quindi in un thread diverso. Ciò significa che qualsiasi calcolo pesante fatto / lunga richiesta da parte del servizio non bloccherà il thread dell'interfaccia utente.
Sydney

28
So che hai fatto lo sforzo per farlo, ma avrebbe più senso metterlo su github o un sito di condivisione di codice sorgente simile e pubblicare qui il link. È più facile per le persone farlo funzionare in questo modo.
Ehtesh Choudhury,

25
Buon esempio. Ho inserito questo codice in un repository online (con modifiche minori) per coloro che vorrebbero clonare: bitbucket.org/alexfu/androidserviceexample/src
Alex Fu,

7
La messaggistica è davvero necessaria solo se il tuo servizio può essere chiamato da altre applicazioni. In caso contrario, è possibile utilizzare un Raccoglitore che restituisce un riferimento al Servizio e chiamare semplicemente metodi pubblici di esso.
type-a1pha,

13
Avresti dovuto porre la domanda e quindi creare tu stesso una risposta, non rispondere al problema sulla domanda. Grande esempio però;)
7hi4g0

Risposte:


46

Guarda l' esempio LocalService .

Il tuo Servicerestituisce un'istanza di se stesso ai consumatori che chiamano onBind. Quindi è possibile interagire direttamente con il servizio, ad esempio registrando la propria interfaccia di ascolto con il servizio, in modo da poter ottenere richiamate.


2
L'unico problema è che non userebbe un Messenger, quindi non risponderebbe a questa pseudo-domanda. Ho usato un LocalService, ma sono stato felice di trovare un esempio di Messenger / Handler. Non credo che un LocalService possa essere inserito in un altro processo.
Ben

@ Christoper-Orr: sono molto grato che tu abbia pubblicato quel link del Android BroadcastReceivertutorial. Ho usato a LocalBroadcastManagerper scambiare continuamente dati tra due Activityistanze.
Dirk,

Il problema LocalBroadcastManagerè che non è bloccante e devi aspettare i risultati. A volte vuoi risultati immediati.
TheRealChx101,

Potete per favore aiutarmi con questa domanda stackoverflow.com/questions/51508046/…
Rajesh K

20

Per l'invio di dati a un servizio è possibile utilizzare:

Intent intent = new Intent(getApplicationContext(), YourService.class);
intent.putExtra("SomeData","ItValue");
startService(intent);

E dopo il servizio in onStartCommand () ottenere i dati dall'intento.

Per l'invio di dati o eventi da un servizio a un'applicazione (per una o più attività):

private void sendBroadcastMessage(String intentFilterName, int arg1, String extraKey) {
    Intent intent = new Intent(intentFilterName);
    if (arg1 != -1 && extraKey != null) {
        intent.putExtra(extraKey, arg1);
    }
    sendBroadcast(intent);
}

Questo metodo chiama dal tuo servizio. Puoi semplicemente inviare dati per la tua attività.

private void someTaskInYourService(){

    //For example you downloading from server 1000 files
    for(int i = 0; i < 1000; i++) {
        Thread.sleep(5000) // 5 seconds. Catch in try-catch block
        sendBroadCastMessage(Events.UPDATE_DOWNLOADING_PROGRESSBAR, i,0,"up_download_progress");
    }

Per ricevere un evento con dati, crea e registra il metodo registerBroadcastReceivers () nella tua attività:

private void registerBroadcastReceivers(){
    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int arg1 = intent.getIntExtra("up_download_progress",0);
            progressBar.setProgress(arg1);
        }
    };
    IntentFilter progressfilter = new IntentFilter(Events.UPDATE_DOWNLOADING_PROGRESS);
    registerReceiver(broadcastReceiver,progressfilter);

Per inviare più dati, è possibile modificare il metodo sendBroadcastMessage();. Ricorda: devi registrare le trasmissioni in onResume () e annullare la registrazione nei metodi onStop ()!

AGGIORNARE

Per favore, non usare il mio tipo di comunicazione tra Attività e Servizi. Questo è il modo sbagliato Per un'esperienza migliore, utilizzare librerie speciali, come noi:

1) EventBus di greenrobot

2) Otto di Square Inc

PS Sto usando EventBus solo da Greenrobot nei miei progetti,


2
dove dovrei avere bisogno di registrarmi su onResume e su onStop potrei dover fare in attività?
user3233280,

Sì. Per ricevere l'evento dal servizio è necessario registrare la trasmissione in onResume. Ricorda che devi annullare la registrazione della trasmissione in onStop. Ora, non consiglio di usare il mio metodo. Si prega di utilizzare librerie speciali per comunicare con altre viste / attività / servizi come EventBus github.com/greenrobot/EventBus o Otto github.com/square/otto
a.black13

1
mi potete aiutare come posso usare questo ho bloccato nel mio progetto nella comunicazione di servizio
user3233280

8
Google ha sconsigliato questo o stai solo dicendo che è "sbagliato" perché pensi che le altre soluzioni siano migliori?
Kevin Krumwiede,

più uno per fornire collegamenti a EventBuse Otto.
Mohammed Ali,

14

Nota: non è necessario verificare se il servizio è in esecuzione CheckIfServiceIsRunning(), poiché bindService()verrà avviato se non è in esecuzione.

Inoltre: se si ruota il telefono non lo si desidera bindService()più, perché onCreate()verrà chiamato di nuovo. Assicurati di definire onConfigurationChanged()per evitare questo.


Nel mio caso, non ho bisogno che il servizio sia sempre attivo. Se il servizio è già in esecuzione all'avvio dell'attività, allora voglio associarlo. Se il servizio non è in esecuzione all'avvio dell'attività, desidero interrompere il servizio.
Lance Lefebure,

1
Non sono sicuro che ciò sia vero, bindService non avvia il servizio, puoi indicare la documentazione?
Calin,

1
developer.android.com/reference/android/app/Service.html Il primo paragrafo affermaServices can be started with Context.startService() and Context.bindService()
Someone Somewhere

8
Message msg = Message.obtain(null, 2, 0, 0);
                    Bundle bundle = new Bundle();
                    bundle.putString("url", url);
                    bundle.putString("names", names);
                    bundle.putString("captions",captions); 
                    msg.setData(bundle);

Quindi lo mandi al servizio. Successivamente ricevere.


8

Va tutto bene. Buon esempio di activity/servicecomunicazione con Messenger .

Un commento: il metodo MyService.isRunning()non è richiesto .. bindService()può essere fatto un numero qualsiasi di volte. nessun danno in questo.

Se MyService è in esecuzione in un processo diverso, la funzione statica MyService.isRunning()restituirà sempre false. Quindi non è necessaria questa funzione.


2

È così che ho implementato Attività-> Comunicazione di servizio: sulla mia attività che avevo

private static class MyResultReciever extends ResultReceiver {
     /**
     * Create a new ResultReceive to receive results.  Your
     * {@link #onReceiveResult} method will be called from the thread running
     * <var>handler</var> if given, or from an arbitrary thread if null.
     *
     * @param handler
     */
     public MyResultReciever(Handler handler) {
         super(handler);
     }

     @Override
     protected void onReceiveResult(int resultCode, Bundle resultData) {
         if (resultCode == 100) {
             //dostuff
         }
     }

E poi l'ho usato per avviare il mio servizio

protected void onCreate(Bundle savedInstanceState) {
MyResultReciever resultReciever = new MyResultReciever(handler);
        service = new Intent(this, MyService.class);
        service.putExtra("receiver", resultReciever);
        startService(service);
}

Nel mio servizio ho avuto

public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null)
        resultReceiver = intent.getParcelableExtra("receiver");
    return Service.START_STICKY;
}

Spero che sia di aiuto


0

Mi sembra che avresti potuto risparmiare un po 'di memoria dichiarando la tua attività con "implementa Handler.Callback"


0

Ottimo tutorial, presentazione fantastica. Pulito, semplice, breve e molto esplicativo. Tuttavia, il notification.setLatestEventInfo(this, getText(R.string.service_label), text, contentIntent);metodo non esiste più. Come trante ha affermato qui , un buon approccio sarebbe:

private static final int NOTIFICATION_ID = 45349;

private void showNotification() {
    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("My Notification Title")
                    .setContentText("Something interesting happened");

    Intent targetIntent = new Intent(this, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, targetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentIntent);
    _nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    _nManager.notify(NOTIFICATION_ID, builder.build());
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (_timer != null) {_timer.cancel();}
    _counter=0;
    _nManager.cancel(NOTIFICATION_ID); // Cancel the persistent notification.
    Log.i("PlaybackService", "Service Stopped.");
    _isRunning = false;
}

Controllato, tutto funziona come un fascino (i nomi di attività e servizi potrebbero differire dall'originale).


0

Ho visto tutte le risposte. Voglio dire il modo più robusto ora un giorno . Ciò ti farà comunicare tra Activity - Service - Dialog - Fragments(Tutto).

EventBus

Questa lib che sto usando nei miei progetti ha grandi funzionalità legate alla messaggistica.

EventBus in 3 passaggi

  1. Definisci eventi:

    public static class MessageEvent { /* Additional fields if needed */ }

  2. Preparare gli abbonati:

Dichiarare e annotare il metodo di iscrizione, facoltativamente specificare una modalità thread :

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(MessageEvent event) {/* Do something */};

Registra e annulla la registrazione del tuo abbonato. Ad esempio su Android, le attività e i frammenti dovrebbero generalmente registrarsi in base al loro ciclo di vita:

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}
  1. Pubblica eventi:

    EventBus.getDefault().post(new MessageEvent());

Aggiungi questa dipendenza nel tuo livello di app

compile 'org.greenrobot:eventbus:3.1.1'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.