【第一篇】学习 android 事件总线androidEventbus之sticky事件的传递

最近再看eventbus相关代码,首先从使用开始,后期再从源码角度分析eventbus.使用Demo后期公布到github上去。
使用的框架地址:https://github.com/bboyfeiyu/AndroidEventBus

Sticky 事件 使用例子:

1,首先每个Activity或者fragement都要进行eventBus的注册和反注册。
发送sticky事件的activity:
  1.  1 package com.example.mysimpleeventbus;
     2 import org.simple.eventbus.EventBus;
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.support.v7.app.ActionBarActivity;
     6 import android.view.View;
     7 import android.view.View.OnClickListener;
     8 import android.widget.Button;
     9 public class MainActivity extends ActionBarActivity {
    10     
    11     private Button button;
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.activity_main);
    16         button = (Button)findViewById(R.id.button);
    17         // 1 首先注册事件总线
    18         EventBus.getDefault().register(this);
    19         button.setOnClickListener(new OnClickListener() {
    20             
    21             @Override
    22             public void onClick(View arg0) {
    23                 // 2 发送Sticky事件
    24                 EventBus.getDefault().postSticky(
    25                         new User("soyoungboy", "西安财经学院"));
    26                 
    27                 // 跳转页面
    28                 Intent intent = new Intent(MainActivity.this, OtherActivity.class);
    29                 startActivity(intent);
    30             }
    31         });
    32     }
    33     @Override
    34     protected void onDestroy() {
    35         super.onDestroy();
    36         EventBus.getDefault().unregister(this);
    37     }
    38 }

 
接收事件的类:
注意这里的注册不是register就行了,而是:EventBus.getDefault().registerSticky(this);
 1 package com.example.mysimpleeventbus;
 2 import org.simple.eventbus.EventBus;
 3 import org.simple.eventbus.Subscriber;
 4 import android.app.Activity;
 5 import android.os.Bundle;
 6 import android.widget.Toast;
 7 public class OtherActivity extends Activity {
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         // TODO Auto-generated method stub
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13         //注意此处的registerSticky而不是register
14         EventBus.getDefault().registerSticky(this);
15     }
16     //此处获取发送事件的内容
17     @Subscriber
18     void showToast(User user) {
19         Toast.makeText(OtherActivity.this, user.toString(), Toast.LENGTH_LONG).show();
20     }
21     @Override
22     protected void onDestroy() {
23         super.onDestroy();
24         //同样需要unregister
25         EventBus.getDefault().unregister(this);
26     }
27 }
然后配置文件:
  1.  1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.mysimpleeventbus"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6     <uses-sdk
     7         android:minSdkVersion="8"
     8         android:targetSdkVersion="20" />
     9     <application
    10         android:allowBackup="true"
    11         android:icon="@drawable/ic_launcher"
    12         android:label="@string/app_name"
    13         android:theme="@style/AppTheme" >
    14         <activity
    15             android:name=".MainActivity"
    16             android:label="@string/app_name" >
    17             <intent-filter>
    18                 <action android:name="android.intent.action.MAIN" />
    19                 <category android:name="android.intent.category.LAUNCHER" />
    20             </intent-filter>
    21         </activity>
    22         <activity android:name=".OtherActivity" >
    23         </activity>
    24     </application>
    25 </manifest>

如果MainActivity发送事件总线时,设置Tag的话,OtherActivity@Subscriber 注解没有添加tag的话,就不会获取到数据,除非设置tag
设置tag代码如下:
  1.  1 EventBus.getDefault().postSticky( 2 new User("soyoungboy", "西安财经学院"),"soyoungboy");  
则对应的OtherActivity中接收的改为:
  1. //此处获取发送事件的内容
  2. 1 //此处获取发送事件的内容
    2     @Subscriber(tag = "soyoungboy")
    3     void showToast(User user) {
    4         Toast.makeText(OtherActivity.this, user.toString(), Toast.LENGTH_LONG).show();
    5     }
框架对应Demo中有这样一句话:
不同组件 (Activity、Fragment、Service等)、不同线程之间都可以通过事件总线来发布事件,它是线程安全的。
 * 只要发布的事件的参数类型和tag都匹配即可接收到事件.  
 
原文地址:https://www.cnblogs.com/androidsuperman/p/4630996.html