【第一篇】学习 android 事件总线androidEventbus之sticky事件的传递
最近再看eventbus相关代码,首先从使用开始,后期再从源码角度分析eventbus.使用Demo后期公布到github上去。
使用的框架地址:https://github.com/bboyfeiyu/AndroidEventBus
Sticky 事件 使用例子:
1,首先每个Activity或者fragement都要进行eventBus的注册和反注册。
发送sticky事件的activity:
-
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 <?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 EventBus.getDefault().postSticky( 2 new User("soyoungboy", "西安财经学院"),"soyoungboy");
则对应的OtherActivity中接收的改为:
//此处获取发送事件的内容
-
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都匹配即可接收到事件.