Связь EventBus между активностью и сервисом

Я работаю над приложением для Android с библиотекой EventBus. У меня есть деятельность и услуга. Я хочу запустить событие из активности и получить его на службе.

Деятельность это:

public class MainActivity extends AppCompatActivity {

    public static final String TAG="ACTIVITY";

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(StartEvent event) {
        Log.d(TAG, "Received message");
        Snackbar.make(fab, "Stop task", Snackbar.LENGTH_LONG).show();
        txtMessage.setText(event.message);
    };

    FloatingActionButton fab;


    TextView txtMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        txtMessage=findViewById(R.id.txtMessage);
        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Start background process", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
                txtMessage.setText("Begin");
                Log.d(TAG,Thread.currentThread().getName()+ " ");
                EventBus.getDefault().post(new StartEvent());
            }
        });
    }

    @Override
    protected void onPause() {
        EventBus.getDefault().unregister(this);
        super.onPause();
    }

    @Override
    protected void onResume() {
        // registriamo un receiver per ricevere una notifica alla fine del servizio in background
        EventBus.getDefault().register(this);
        super.onResume();
    }


}

Услуга:

public class MyService extends Service {
    public static final String TAG="SERVICE";

    public MyService() {
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY_COMPATIBILITY;
    }

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

    }

    @Override
    public void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

    @Subscribe
    public void onEvent(StartEvent event){
        Log.d(TAG, "BEGIN process in background su thread "+Thread.currentThread().getName());

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d(TAG, "END processo in background su thread "+Thread.currentThread().getName());

        MessageEvent message=new MessageEvent();
        message.message="Operazione in background terminata!";
        EventBus.getDefault().post(message);
    }

}

Манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication6">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>
    </application>

</manifest>

Когда я нажимаю кнопку активности, чтобы запустить фоновую задачу, EventBus показывает мне следующее сообщение на logcat:

ACTIVITY: main 
EventBus: No subscribers registered for event class xx.StartEvent
EventBus: No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent

Что случилось?


person xcesco    schedule 14.11.2017    source источник


Ответы (2)


Служба должна быть запущена, прежде чем она сможет получать события.

Если он не запущен, он не зарегистрирован, а если он не зарегистрирован, вы увидите сообщение no subscribers.

person ESala    schedule 14.11.2017

Это потому, что один и тот же экземпляр шины не может работать в разных процессах.

андроид: экспортировано = "истина"

Ваш MainService экспортируется, что означает, что это другой процесс.

person Inkognito    schedule 23.02.2018
comment
AFAIK exported не влияет на процесс. Это просто означает, что его может запускать другое приложение. Однако он запустит файл process вашего приложения. - person ufoq; 16.04.2021