EventBus事件总线初识

        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();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值