在android开发中往往需要设定一个时间(假定时间计时在底层c++线程计时实现),时间到达后,发送msg给android上层并响应事件。
下面应用举例DTV搜台事件说明监听的实现方法:
上层channelTuning.java的activity中:
private class DtvScanEventListener implements OnDtvScanEventListener {
@Override
public boolean onDtvScanEvent(int what, int arg1, int arg2, Object info) {
if (what == TvChannelManager.TVPLAYER_DTV_AUTO_TUNING_SCAN_INFO) {
Message msg = mDtvUiEventHandler.obtainMessage(what, info);
mDtvUiEventHandler.sendMessage(msg);
return true;
}
return false;
}
}
下面代码来实现注册与解注册监听:
private OnDtvScanEventListener mDtvScanEventListener = null;
@Override
protected void onResume() {
mDtvScanEventListener = new DtvScanEventListener();
TvChannelManager.getInstance().registerOnDtvScanEventListener(mDtvScanEventListener);
super.onResume();
}
@Override
protected void onPause() {
if (null != mDtvScanEventListener) {
TvChannelManager.getInstance().unregisterOnDtvScanEventListener(mDtvScanEventListener);
mDtvScanEventListener = null;
mDtvUiEventHandler.removeCallbacksAndMessages(null);
}
super.onPause();
}
mDtvUiEventHandler是该activity中的handle可以用来更新UI等操作。
DtvScanEventListener 实现的是OnDtvScanEventListener 接口找到相应文件:TvChannelManager.java如下
private ArrayList<OnDtvScanEventListener> mDtvScanEventListeners = new ArrayList<OnDtvScanEventListener>();
public interface OnDtvScanEventListener {
boolean onDtvScanEvent(int what, int arg1, int arg2, Object info);
}
public boolean registerOnDtvScanEventListener(OnDtvScanEventListener listener) {
synchronized (mDtvScanEventListeners) {
mDtvScanEventListeners.add(listener);
}
return true;
}
public boolean unregisterOnDtvScanEventListener(OnDtvScanEventListener listener) {
synchronized (mDtvScanEventListeners) {
mDtvScanEventListeners.remove(listener);
}
return true;
}
其中使用TvChannelManager这个类来实现注册与解注册.
下面关键的是从jni中接收到的event的事件,然后代用此接口方法:
private class EventHandler extends Handler {
EventHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
if (msg.what > TVPLAYER_DTV_SCAN_EVENT_START && msg.what < TVPLAYER_DTV_SCAN_EVENT_END) {
synchronized (mDtvScanEventListeners) {
for (OnDtvScanEventListener l : mDtvScanEventListeners) {
Bundle data = msg.peekData();
data.setClassLoader(DtvEventScan.class.getClassLoader());
Object msgObj = data.getParcelable("messageObj");
l.onDtvScanEvent(msg.what, msg.arg1, msg.arg2, msgObj);
}
}
}
}
如果有注册监听,那么就会调用监听实例所实现的接口方法。
另外介绍的是:在构造方法中,写一个handle。在onEvent中发送msg,
Looper looper;
if ((looper = Looper.myLooper()) != null) {
mHandler = new EventHandler(looper);
} else if ((looper = Looper.getMainLooper()) != null) {
mHandler = new EventHandler(looper);
} else {
mHandler = null;
}
@Override
public boolean onEvent(Message msg) throws RemoteException {
if (mHandler != null) {
Message msgTmp = mHandler.obtainMessage();
msgTmp.copyFrom(msg);
mHandler.sendMessage(msgTmp);
}
return true;
}
这个重写的onEvent方法,该方法是一个接口方法。最终实现的效果是JNI中调用.java文件中的静态方法,这个静态方法就会调用实现了onEvent方法的接口实例中重写了onEvent方法。