Handler主要用来在线程之间的通信的机制。如在Activity或Service中需要接收其他线程的消息,则在需要接收消息的Activity或Service中需要实现Callback接口。下面是PowerManagerService中用于接收其他线程消息的handleMessage()的例子:

    private final class PowerManagerHandler extends Handler {        public PowerManagerHandler(Looper looper) {            super(looper, null, true /*async*/);        }        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case MSG_USER_ACTIVITY_TIMEOUT:                    handleUserActivityTimeout();                    break;                case MSG_SANDMAN:                    handleSandman();                    break;                case MSG_SCREEN_ON_BLOCKER_RELEASED:                    handleScreenOnBlockerReleased();                    break;                case MSG_CHECK_IF_BOOT_ANIMATION_FINISHED:                    checkIfBootAnimationFinished();                    break;            }        }    }

然后在创建Handler的地方将实现了Callback的类的实例传入:

    public void init(Context context, LightsService ls,            ActivityManagerService am, BatteryService bs, IBatteryStats bss,            DisplayManagerService dm) {        mContext = context;        mLightsService = ls;        mBatteryService = bs;        mBatteryStats = bss;        mDisplayManagerService = dm;        mHandlerThread = new HandlerThread(TAG);        mHandlerThread.start();        mHandler = new PowerManagerHandler(mHandlerThread.getLooper());//将实现了Callback类的实例传入        Watchdog.getInstance().addMonitor(this);        // Forcibly turn the screen on at boot so that it is in a known power state.        // We do this in init() rather than in the constructor because setting the        // screen state requires a call into surface flinger which then needs to call back        // into the activity manager to check permissions.  Unfortunately the        // activity manager is not running when the constructor is called, so we        // have to defer setting the screen state until this point.        mDisplayBlanker.unblankAllDisplays();    }


然后当在线程中可使用如下代码向PowerManagerService发送消息:

    private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm,            final String reason, boolean wait) {        if (mHandler == null || !mSystemReady) {            throw new IllegalStateException("Too early to call shutdown() or reboot()");        }        Runnable runnable = new Runnable() {            @Override            public void run() {                synchronized (this) {                    if (shutdown) {                        ShutdownThread.shutdown(mContext, confirm);                    } else {                        ShutdownThread.reboot(mContext, reason, confirm);                    }                }            }        };        // ShutdownThread must run on a looper capable of displaying the UI.        Message msg = Message.obtain(mHandler, runnable);        msg.setAsynchronous(true);        mHandler.sendMessage(msg);//向PowerManagerService发送message        // PowerManager.reboot() is documented not to return so just wait for the inevitable.        if (wait) {            synchronized (runnable) {                while (true) {                    try {                        runnable.wait();                    } catch (InterruptedException e) {                    }                }            }        }    

当执上面的代码之后,创建这个Handler(PowerManagerHandler)时使用Callback实例的handleMessage将会被调用。

 

可以使用如下代码将一个线程实例放入到Handler中使其执行:

            if(mHandler != null) {                mHandler.removeCallbacks(mStopDetectionTimeoutRunnable);                mHandler.postDelayed(mStopDetectionTimeoutRunnable, WAIT_FOR_DETECTION_TIMEOUT);            }

可使用如下代码删除这个线程:

        if(mHandler != null) {            mHandler.removeMessages(MSG_OPEN_LENOVO_SMART_STANDBY_CAMERA_SUCCESS);            mHandler.removeCallbacks(mStopDetectionTimeoutRunnable);        }

 Handler上还有许多类似的发送消息或添加线程的方法。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. ProgressBar
  3. 2011年沈大海讲师Android的腾讯微博客户端源代码,实现oauth_verif
  4. android 应用的网络请求工具
  5. Android(安卓)Dialog设置TYPE_SYSTEM_ALERT 小米,魅族手机不能显
  6. Android下载repo文件报错
  7. 在Titanium中使用Android的Service
  8. 纯css3无js实现的Android(安卓)Logo(有简单动画)
  9. 在程序开发中必须了解Activity的四种启动模式

随机推荐

  1. Android中几种图像特效处理的小技巧,比如
  2. android架构师之路——APP外置换肤原理解
  3. Android中利用ViewPager实现视图切换
  4. 解决Android(安卓)Studio连不上Android设
  5. Android(安卓)之 使用MediaPlayer播放音
  6. 诺基亚推出Android平板N1和Z Launcher
  7. Android系列教程之四:Android项目的目录结
  8. Android名词解释之什么是APK文件
  9. 如何在Android(安卓)Studio中导入包:andro
  10. Android的背景