Örnek: Mesajlaşma kullanarak Etkinlik ve Hizmet arasındaki iletişim


584

Bir etkinlik ve hizmet arasında nasıl mesaj gönderileceğine dair bir örnek bulamadım ve bunu anlamak için çok fazla zaman harcadım. İşte başkalarının başvurması için örnek bir proje.

Bu örnek, bir hizmeti doğrudan başlatmanıza veya durdurmanıza ve hizmeti ayrı olarak bağlamanıza / bağlantısını kesmenize olanak tanır. Hizmet çalışırken, 10 Hz'de bir sayıyı artırır. Etkinlik, öğesine bağlıysa Service, geçerli değeri görüntüler. Veriler bir Tamsayı ve bir String olarak aktarılır, böylece bunu iki farklı şekilde nasıl yapacağınızı görebilirsiniz. Etkinlikte, servise mesaj göndermek için düğmeler de vardır (artış değerini değiştirir).

Ekran görüntüsü:

Android hizmeti mesajlaşma örneğinin ekran görüntüsü

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 \ değerlerin \ 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
Harika bir örnek! Başka bir güzel özellik: Hizmetinizin etiketine android:process=:myservicenameniteliklerinizi servicemanifest.xml dosyanızda (örneğin:) koyarsanız <service android:name="sname" android:process=":myservicename" />, hizmetinizi farklı bir işlem olarak, dolayısıyla farklı bir iş parçacığında çalıştırır. Bu, servis tarafından yapılan herhangi bir ağır hesaplamanın / uzun talebin UI iş parçacığınızı asmayacağı anlamına gelir.
sydd

28
Bunu yapmak için çaba harcadığınızı biliyorum, ancak github'a veya benzer bir kaynak kodu paylaşım sitesine koymak ve bağlantıyı buraya göndermek daha mantıklı olacaktır. İnsanların bu şekilde kalkması ve çalıştırması daha kolaydır.
Ehtesh Choudhury

25
İyi örnek. Bu kodu klonlamak isteyenler için çevrimiçi bir repoya (küçük değişikliklerle) koydum: bitbucket.org/alexfu/androidserviceexample/src
Alex Fu

7
Mesajlaşma sadece servisiniz başka uygulamalar tarafından aranabiliyorsa gereklidir. Aksi takdirde, size Hizmete bir başvuru döndüren bir Ciltçi ile yapışabilir ve yalnızca genel yöntemlerini çağırabilirsiniz.
type-a1pha

13
Soruyu sormuş olmanız ve daha sonra sorudaki soruyu cevaplamamanız gerekir. Harika bir örnek olsa da;)
7hi4g0

Yanıtlar:


46

Bak LocalService örneğin .

Sizin Service, arayan tüketicilere kendi örneğini döndürür onBind. Daha sonra, servisle doğrudan etkileşim kurabilirsiniz, örn. Kendi dinleyici arayüzünüzü servise kaydettirerek geri aramalar alabilirsiniz.


2
Bununla ilgili tek sorun, bir Messenger kullanmamasıdır, bu yüzden bu sahte soruyu cevaplamaz. Bir LocalService kullandım, ancak bir Messenger / Handler örneği bulmaktan memnuniyet duydum. Bir LocalService'in başka bir işlemde kullanılabileceğine inanmıyorum.
Ben

@ Christoper-Orr: Eğiticinin bu bağlantısını gönderdiğiniz için çok minnettarım Android BroadcastReceiver. LocalBroadcastManagerİki Activityörnek arasında sürekli veri alışverişi yapmak için a kullandım .
Dirk

Sorun, LocalBroadcastManagerengellememe ve sonuçları beklemek zorunda olmasıdır. Bazen anında sonuç almak istersiniz.
TheRealChx101

Bu soruda bana yardımcı olabilir misiniz stackoverflow.com/questions/51508046/…
Rajesh K

20

Bir servise veri göndermek için şunları kullanabilirsiniz:

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

Ve onStartCommand () hizmetinde sonra niyetten veri almak.

Bir hizmetten bir uygulamaya veri veya olay göndermek için (bir veya daha fazla etkinlik için):

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);
}

Bu yöntem hizmetinizden arıyor. Yalnızca Faaliyetiniz için veri gönderebilirsiniz.

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");
    }

Verileri olan bir olay almak için, etkinlikteki registerBroadcastReceivers () yöntemini oluşturun ve kaydedin:

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);

Daha fazla veri göndermek için yöntemi değiştirebilirsiniz sendBroadcastMessage();. Unutmayın: yayınları onResume () yöntemine kaydettirmeli ve onStop () yöntemlerine kaydını silmelisiniz!

GÜNCELLEME

Lütfen Etkinlik ve Hizmet arasındaki iletişim türümü kullanmayın. Bu yanlış yol. Daha iyi bir deneyim için lütfen bizim gibi özel kütüphaneler kullanın:

1) Greenrobot'tan EventBus

2) Otto Inc şirketinden

PS Projelerimde sadece greenrobot'tan EventBus kullanıyorum,


2
onResume ve onStop alıcıları nerede kayıt olmalıyım faaliyette yapmak gerekebilir?
user3233280

Evet. Hizmetten alma olayı için yayını onResume'a kaydetmelisiniz. OnStop'taki yayın kaydını silmeniz gerektiğini unutmayın. Şimdi, yöntemimi kullanmanızı önermiyorum. EventBus github.com/greenrobot/EventBus veya Otto github.com/square/otto
a.black13

1
u pls bana yardımcı olabilir nasıl bu ben hizmet iletişiminde benim projede sıkışmış kullanabilirsiniz
user3233280 25:14

8
Google buna karşı çıktı mı yoksa diğer çözümlerin daha iyi olduğunu düşündüğünüz için bunun "yanlış" olduğunu mu söylüyorsunuz?
Kevin Krumwiede

artı bir EventBusve Otto.
Muhammed Ali

14

Not: Hizmetinizin çalışıp çalışmadığını kontrol etmenize gerek yoktur CheckIfServiceIsRunning(), çünkü bindService()çalışmazsa çalışacaktır.

Ayrıca: telefonu döndürürseniz bindService()tekrar istemezsiniz , çünkü onCreate()tekrar aranacaktır. onConfigurationChanged()Bunu önlemek için tanımladığınızdan emin olun .


Benim durumumda, sürekli çalışan servise ihtiyacım yok. Etkinlik başladığında hizmet zaten çalışıyorsa, ona bağlanmak istiyorum. Etkinlik başladığında hizmet çalışmıyorsa, hizmeti durdurulmuş olarak bırakmak istiyorum.
Lance Lefebure

1
Bunun doğru olduğundan emin değilim, bindService hizmeti başlatmıyor, lütfen belgelere işaret edebilir misiniz?
Calin

1
developer.android.com/reference/android/app/Service.html İlk paragrafın belirtileriServices can be started with Context.startService() and Context.bindService()
Birisi

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);

Böylece servise gönderirsiniz. Daha sonra alın.


8

Her şey yolunda, Messengeractivity/service kullanarak iyi bir iletişim örneği .

Bir yorum: yöntem MyService.isRunning()gerekli değildir .. bindService()herhangi bir sayıda yapılabilir. hiçbir zararı yok.

MyService farklı bir işlemde çalışıyorsa, statik işlev MyService.isRunning()her zaman false değerini döndürür. Yani bu işleve gerek yok.


2

Etkinlik -> Hizmet İletişimi: Benim Faaliyetlerimde ben

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
         }
     }

Sonra bunu Hizmetimi başlatmak için kullandım

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

Hizmetimde

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

Bu yardımcı olur umarım


0

Bana öyle geliyor ki, "Implements Handler.Callback" ile etkinliğinizi ilan ederek hafızayı kurtarabilirdiniz.


0

Büyük öğretici, harika sunum. Düzgün, basit, kısa ve çok açıklayıcı. Bununla birlikte, notification.setLatestEventInfo(this, getText(R.string.service_label), text, contentIntent);yöntem artık değil. Trante belirtildiği gibi burada , iyi bir yaklaşım olacaktır:

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;
}

Kendime baktığımda, her şey bir cazibe gibi çalışıyor (etkinlik ve hizmet adları orijinalden farklı olabilir).


0

Bütün cevapları gördüm. Şimdi bir gün en sağlam yolu söylemek istiyorum . Bu, Activity - Service - Dialog - Fragments(Her şey) arasında iletişim kurmanızı sağlayacaktır .

EventBus

Projelerimde kullandığım bu lib mesajlaşma ile ilgili harika özelliklere sahip.

3 adımda EventBus

  1. Olayları tanımlayın:

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

  2. Aboneler hazırlayın:

Abonelik yönteminizi beyan edin ve açıklama ekleyin, isteğe bağlı olarak bir iş parçacığı modu belirtin :

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

Abonenizi kaydedin ve kaydını kaldırın. Örneğin, Android'de etkinlikler ve fragmanlar genellikle yaşam döngülerine göre kaydolmalıdır:

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

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}
  1. Etkinlik yayınla:

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

Bu bağımlılığı uygulama düzeyi sınıfınıza ekleyin

compile 'org.greenrobot:eventbus:3.1.1'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.