EventBus:通过解耦发布者和订阅者简化Android事件传递,EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
Demo:对于APP全局网络判断:
import org.greenrobot.eventbus.EventBus;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class NetWorkConnectChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
boolean networkConnected = AppNetworkMgr.isNetworkConnected(context);
Log.d("wangchao","当前网络状态:--"+networkConnected);
EventBus.getDefault().post(new NetWorkChangeEvent(networkConnected));
}
}
创建BaseActivty,基类中进行一些操作,子类继承后直接可以使用,避免代码冗余
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mContext = this;
AppManager.getAppManager().addActivity(this);
initTipView();
EventBus.getDefault().register(this);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
hasNetWork(AppNetworkMgr.isNetworkConnected(mContext));
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
AppManager.getAppManager().removeActivity(this);
EventBus.getDefault().unregister(this);
}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
//当view动态添加后直接关闭当前界面,会导致view内存溢出
if (mTipView != null && mTipView.getParent() != null) {
mWindowManager.removeView(mTipView);
}
}
public void setCheckNetWork(boolean isCheckNetWork){
mCheckNetWork = isCheckNetWork;
}
public boolean isCheckNetWork(){
return mCheckNetWork;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNetWorkChangeEvent(NetWorkChangeEvent netWorkChangeEvent){
hasNetWork(netWorkChangeEvent.isConnected);
}
private void hasNetWork(boolean networkConnected) {
if (mCheckNetWork) {
if (networkConnected) {
if (mTipView != null && mTipView.getParent() != null) {
mWindowManager.removeView(mTipView);
AppToastMgr.shortToast(mContext, getResources().getString(R.string.sys_network_normal));
}
}else{
if (mTipView.getParent() == null) {
mWindowManager.addView(mTipView, mLayoutParams);
AppToastMgr.shortToast(mContext, getResources().getString(R.string.sys_network_error));
}
}
}
}
private void initTipView() {
LayoutInflater inLayoutInflater = getLayoutInflater();
mTipView = inLayoutInflater.inflate(R.layout.layout_network_tipview, null);
mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
mLayoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
mLayoutParams.gravity = Gravity.BOTTOM;
mLayoutParams.x = 0;
mLayoutParams.y = 0;
}
权限添加
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
注册:
<receiver android:name=".NetWorkConnectChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
EventBus普通事件传值:
MainActivity:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEditViewEvent(EditTextEvent event){
et_content.setText(event.content);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onButtonEvent(ImageButtonEvent event){
ib_submit.setImageResource(event.imageView);
}
SecondActivity:
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
EventBus.getDefault().post(new EditTextEvent("Hello EditText!"));
EventBus.getDefault().post(new ImageButtonEvent(android.R.drawable.btn_default));
SecondActivity.this.finish();
}
});
创建事件:
public class EditTextEvent {
public String content;
public EditTextEvent(String content){
this.content = content;
}
}
如果对于多值传递: 封装为对象,直接进行对象传递
EventBus粘性事件:
黏性事件就是指在EventBus内部被缓存的那些事件。EventBus为每个类(class)类型保存了最近一次被发送的事件——sticky。后续被发送过来的相同类型的sticky事件会 自动替换之前缓存的事件。当一个监听者向EventBus进行注册时,它会去请求缓存事件。这时,缓存的事件就会立即自动发送给这个监听者,有一定的延时性。
创建粘性事件:方便订阅者进行调用
public class EventBusStickyMessage {
public String message;
public EventBusStickyMessage(String message) {
this.message = message;
}
}
发送粘性事件:
public void send(View view){
EventBus.getDefault().postSticky(new EventBusStickyMessage("HG---"));
Intent intent = new Intent(MainActivity.this, EventBusReceiveActivity.class);
startActivity(intent);
}
接受粘性事件:
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)//true方是启动黏性事件
public void EventBusSticky(EventBusStickyMessage eventBusStickyMessage){
tv_title.setText(eventBusStickyMessage.message);
}
获取粘性事件:
@Override
public void onClick(View v) {
//接收黏性数据
if(flag){
//EventBus注册广播()
//注意:必须在OnDestroy里执行解注册操作,防止内存泄漏,注册一个界面只能注册一次,否则报错
EventBus.getDefault().register(this);
flag=false;
}
取消所有的粘性事件:
// 注意:这里比普通的解除注册还多一步,就是移除黏性事件(是移除所有的还是移除一个,看需求)
@Overrideprotected void onDestroy() {
//移除所有的黏性事件
EventBus.getDefault().removeAllStickyEvents();
//EventBus.getDefault().removeStickyEvent(eventType)
//解除注册 EventBus .getDefault().unregister(this);
super.onDestroy();
}
finally:网络是否可用
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
//获取连接对象
if (mNetworkInfo != null) {
//判断是TYPE_MOBILE网络
if(ConnectivityManager.TYPE_MOBILE == mNetworkInfo.getType()){
AppLogMessageMgr.i("AppNetworkMgr", "网络连接类型为:TYPE_MOBILE");
//判断移动网络连接状态
State STATE_MOBILE = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
if (STATE_MOBILE == State.CONNECTED) {
AppLogMessageMgr.i("AppNetworkMgrd", "网络连接类型为:TYPE_MOBILE, 网络连接状态CONNECTED成功!");
return mNetworkInfo.isAvailable();
}
}
//判断是TYPE_WIFI网络
if(ConnectivityManager.TYPE_WIFI == mNetworkInfo.getType()){
AppLogMessageMgr.i("AppNetworkMgr", "网络连接类型为:TYPE_WIFI");
//判断WIFI网络状态
State STATE_WIFI = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
if (STATE_WIFI == State.CONNECTED) {
AppLogMessageMgr.i("AppNetworkMgr", "网络连接类型为:TYPE_WIFI, 网络连接状态CONNECTED成功!");
return mNetworkInfo.isAvailable();
}
}
}
}
return false;
}
activity管理类:
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;
private AppManager() {
}
public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
return instance;
}
public static Activity getActivity(Class<?> cls) {
if (activityStack != null)
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
return activity;
}
}
return null;
}
public void addActivity(Activity activity) {
activityStack.add(activity);
}
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
}
public void finishActivity(Activity activity) {
if (activity != null && activityStack.contains(activity)) {
activityStack.remove(activity);
activity.finish();
}
}
public void removeActivity(Activity activity) {
if (activity != null && activityStack.contains(activity)) {
activityStack.remove(activity);
}
}
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
break;
}
}
}
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
finishActivity(activityStack.get(i));
}
}
activityStack.clear();
}
public void exitApp() {
try {
finishAllActivity();
} catch (Exception e) {
e.printStackTrace();
}
}
}