给出我自己写的一个小小的状态管理,也可以说是前后台通信的模块。首先我们还是来看看效果
简单说明一下其实这个就是我自己写的一个lib方面以后的前后台通信或者状态改变之间的通信,我们来看看它的代码结构吧。
比较简单就几个简单的类,最主要的就是StateManager.java这个文件那么我就来看看这个类。
package com.bobo.StateManager;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
/**
* 为andorid的activity或者fragment提供或者任意代码片段提供交互
* @author bobo
*
*/
public class StateManager {
/**
* 描述类
* @author bobo
*
*/
class Register {
public String Tag;
public Object regist;
public Register(String tag, Object regist) {
// TODO Auto-generated constructor stub
this.Tag = tag;
this.regist = regist;
}
}
// private ExecutorService executorService = Executors.newCachedThreadPool();//创建线程池
private List<Register> registereds;//当前注册的registered
private static volatile StateManager defaultInstance;//单例
private static String TAG = "StateManagerTag";
private StateHandler statehandler;
private String CallMethod = "StateOnPosted";
/**
* 反射调用方法
*/
public void invokeEvent(QueueMessage message) {
// if(Looper.myLooper() != Looper.getMainLooper())
// methed = "StateOnBackgroundThread";
for (Register key : registereds) {
Object register = key.regist;
Method methodi = findinvokeMethed(register);
//methodi = cla.getMethod("StateOnMainThread", BaseState.class);
try {
if (null != methodi)
methodi.invoke(register, message.baseState);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 反射调用方法
* @param tag
* @param baseState
*/
public void invokeEventByTag(QueueMessage message) {
Register register = findDescribe(message.tag);
if (register != null) {
Method methodi = findinvokeMethed(register.regist);
if (methodi != null)
try {
methodi.invoke(register.regist, message.baseState);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 找到调用的方法
* @param register
* @return
*/
private Method findinvokeMethed(Object register) {
Class<?> cla = register.getClass();
Method methodi = null;
try {
Method methods[] = cla.getMethods();
for (Method method : methods) {
if (method.getName().equals(CallMethod)) {
methodi = method;
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return methodi;
}
/**
* 发送post通知
* @param manager
*/
public void post(BaseState baseState) {
post(null, baseState);
}
/**
* 更据tag发送post通知
* @param tag
* @param baseState
*/
public void post(String tag, BaseState baseState) {
statehandler.enQuene(new QueueMessage(tag, baseState));
}
/**
* 注册Tag
* @param Tag
* @param object
*/
public synchronized void registe(String Tag, Object object) {
if (null == findDescribe(Tag))//防止重复注册
registereds.add(new Register(Tag, object));
else {
Log.i(TAG, Tag + "重复注册");
}
}
public void registe(Object object) {
registe(object.getClass().getSimpleName(), object);
}
/**
* 注销注册的代码片段
* @param object
*/
public void unregiste(Object object) {
if (registereds != null && registereds.size() >= 1) {
registereds.remove(object);
Log.i(TAG, "unregiste " + object.toString());
}
}
/**
* 判断是否已注册
* @param object
* @return
*/
private Register findDescribe(String object) {
Register registe = null;
if (registereds != null && registereds.size() >= 1)
for (Register register : registereds) {
if (register.Tag.equals(object)) {
registe = register;
break;
}
}
return registe;
}
/**
* 私有构造方法
*/
private StateManager() {
registereds = new ArrayList<Register>();
statehandler = new StateHandler();
}
/**
* 单例方法
* @return
*/
public static StateManager getDefault() {
if (defaultInstance == null) {
synchronized (StateManager.class) {
if (defaultInstance == null) {
defaultInstance = new StateManager();
}
}
}
return defaultInstance;
}
}
这个类主要是用来注册class和发送状态通知,通过StateManager.getDefault().registe(this);这个方法或者StateManager.getDefault().registe(tag,this);这个方法来进行需要注册的类,提供这两种注册方法的原因是考虑到有些状态不需要全局发送,就是不需要每个class都监听到,所以可以通过post(Tag,BaseState);这个方法来像指定tag发送信息。然后我们看看是怎么实现的。
package com.bobo.StateManager;
/**
* 基类状态
* @author bobo
*
*/
public abstract class BaseState {
}
这个类是个基类状态可以通过继承这个类来实现自己的功能,然后在看看其他的。
package com.bobo.StateManager;
import java.util.ArrayList;
import java.util.List;
/**
* post queue
* @author bobo
*
*/
public class PostQueue {
private List<QueueMessage> messagequeues = new ArrayList<QueueMessage>();
public void add(QueueMessage baseState) {
messagequeues.add(baseState);
}
public int size() {
return messagequeues.size();
}
public void remove(BaseState baseState) {
messagequeues.remove(baseState);
}
public void removeall() {
messagequeues.clear();
}
public void remove(int position) {
messagequeues.remove(position);
}
public QueueMessage poll() {
if (messagequeues.size() >= 1)
return messagequeues.remove(0);
else
return null;
}
}
这个就是一个消息队列的类,每次通过poll方法取消息队列头的信息。
package com.bobo.StateManager;
import android.os.Handler;
import android.os.Message;
public class StateHandler extends Handler {
private PostQueue postQueue = new PostQueue();
/**
* 入队操作
*/
public void enQuene(QueueMessage baseState) {
postQueue.add(baseState);
sendMessage(obtainMessage());
}
@Override
public void handleMessage(Message arg0) {
// TODO Auto-generated method stub
super.handleMessage(arg0);
while (true) {
QueueMessage message = postQueue.poll();
if (message == null)
return;
else {
if (message.tag == null) //当这个事件没有进行tag注册的时候通知全部发送
StateManager.getDefault().invokeEvent(message);
else
//对进行了tag处理的下发
StateManager.getDefault().invokeEventByTag(message);
}
}
}
}
然后就是这个handler类主要实现的方法的派发和反射调用,根据是不是需要对Tag分类下发。
package com.bobo.StateManager;
/**
* 队列信息
* @author bobo
*
*/
public class QueueMessage {
public BaseState baseState; //队列事件
public String tag;//事件标记
public QueueMessage(String tag, BaseState baseState) {
// TODO Auto-generated constructor stub
this.tag = tag;
this.baseState = baseState;
}
}
最后这个就是队列消息类。
上面的代码都非常简单也写了很多注视。当我们要使用这个StateManager的时候就变得非常简单了。可以把它做成lib然后在其它工程时候调用,达到了代码复用。
下面我就来讲一讲怎么使用。我们还是老规矩上代码。
public class MainActity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mainlayout);
StateManager.getDefault().registe(this);
Intent intent = new Intent(MainActity.this, TestService.class);
startService(intent);
// StateManager.getDefault().registe("mytage", this);//注册带tag
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
StateManager.getDefault().unregiste(this);
}
public void onclick(View view) {
switch (view.getId()) {
case R.id.sendnotag:
StateManager.getDefault().post(new Mystate(true)); //发送不带tag的状态
break;
case R.id.senddef:
StateManager.getDefault().post(new Yourstate()); //发送不带tag的不同状态
break;
case R.id.sendtag:
StateManager.getDefault().post("mytage", new Mystate(true)); //发送带tag的状态
break;
}
}
class Mystate extends BaseState {
public boolean is;
public String HH = "my state hello";
public Mystate(boolean is) {
// TODO Auto-generated constructor stub
super();
this.is = is;
}
}
class Yourstate extends BaseState {
public String Tag = "YourState";
}
/**
* 回调方法
* @param mystate
*/
public void StateOnPosted(BaseState baseState) {
if (baseState instanceof Mystate) {
Mystate mystate = (Mystate) baseState;
Toast.makeText(this, "hello this is mystate" + mystate.is + " " + mystate.HH, 0).show();
} else if (baseState instanceof Yourstate) {
Yourstate yourtast = (Yourstate) baseState;
Toast.makeText(this, "hello this is yourstate" + yourtast.Tag, 0).show();
} else {
Toast.makeText(this, "hello this is callback", 0).show();
}
}
}
上面的代码非常的简单和明了一开始调用注册函数把class注册到StateManager中然后通过post方法直接通知过来。然后还写了一个Service的测试类不过都一样。
package com.test.activity;
import com.bobo.StateManager.BaseState;
import com.bobo.StateManager.StateManager;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class TestService extends Service {
private String Tag = "Testservcei";
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
StateManager.getDefault().registe("mytage", this); //注册
// StateManager.getDefault().post(new BaseState() {
// });
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public void StateOnPosted(BaseState baseState) {
//Log.i(Tag, "state on service");
Toast.makeText(this, "Service receved messgae", 0).show();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
StateManager.getDefault().unregiste(this);
}
}
使用起来是不是很简单啊,不过还有待改进。好了今天就到这里了。这里给出源码的下载地址:https://github.com/shengbo1992/StateManager-android