在一個可移動浮動按鈕的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中處理。翻譯