利用handle实现事件监听

本文详细介绍了一种在Android开发中实现DTV搜台事件监听的方法。通过创建DtvScanEventListener类实现OnDtvScanEventListener接口,可在特定时间点触发事件并更新UI。文章展示了如何在Activity中注册和解注册监听器,以及底层JNI与Java层交互的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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方法。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值