在一个可移动浮动按钮的demo源码学习中,有一些WindowManager的使用,在此作下总结。框架
1.翻译过来就是窗口管理,是和应用框架层的窗口管理器交互的接口,经过ide
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);函数
能够得到它的实例。布局
2.WindowManager继承了ViewManager,有几个重要的接口:post
Message和Handler的用法学习
在demo中实现了一个handler子类,handler子类必需要实现handleMessage(Message msg)函数,来处理接收到的信息。handler就像一个机器人,你设定好它对各个命令的反应(重写handleMessage),它就等待,并在接收到命令后,按照你的要求来完成。ui
handler能够定时发送massage,在这个demo中handler的postDelayed接口常常被调用,跟踪源码发现,其最终调用了sendMessageAtTime。spa
private void sendUpdateMsg(Handler handler, int status, int seconds) { final Message msg = Message.obtain(handler); msg.what = status; handler.postDelayed(new Runnable() { @Override public void run() { msg.sendToTarget(); } }, seconds * 1000); } private class UpdateStatHander extends Handler { @Override public void handleMessage(Message msg) { TextView currStat = (TextView) mDetailView .findViewById(R.id.tv_curr_stat); Button changButton = (Button) mDetailView .findViewById(R.id.btn_chg_stat); ImageView statImg = (ImageView) mCtrlView .findViewById(R.id.img_stat); switch (msg.what) { case STAT_READY_GENERAL: currStat.setText(mContext.getString(R.string.stat_gen)); statImg.setBackgroundResource(R.drawable.stat_gen); changButton.setEnabled(true); break; case STAT_OPER_BUILD: currStat.setText(mContext.getString(R.string.stat_build)); break; case STAT_OPER_CHECK: currStat.setText(R.string.stat_chk_auth); break; case STAT_READY_SECURE: currStat.setText(mContext.getString(R.string.stat_sec)); statImg.setBackgroundResource(R.drawable.stat_sec); changButton.setEnabled(true); break; case STAT_OPER_DES: currStat.setText(mContext.getString(R.string.stat_des)); break; } } }
public final boolean postDelayed(Runnable r, long delayMillis);在delayMillis毫秒后建立新的线程执行一些操做。线程
Message通常须要设置两个参数,一个是target,它是处理massage的handler,即此消息发给谁,在Message.obtain(handler);中能够设置。另外一个是what,通常用来识别消息类型,在handler中用switch(massage.what)case...来进行处理。msg.sendToTarget();能够发送消息,以后进入对应的handler中处理。翻译