0

私は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 

どうしたのですか?

答えて

1

イベントはイベントを受信する前に実行されている必要があります。

実行されていない場合は登録されておらず、登録されていない場合はno subscribersメッセージが表示されます。

1

同じバスインスタンスは異なるプロセスで実行できないためです。

アンドロイド:

があなたのMainServiceがエクスポートされた= "true" をエクスポートし、それは別のプロセスだということを意味します。

関連する問題