WindowManager massge和handler

在一個可移動浮動按鈕的demo源碼學習中,有一些WindowManager的使用,在此作下總結。框架

1.翻譯過來就是窗口管理,是和應用框架層的窗口管理器交互的接口,經過ide

mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);函數

能夠得到它的實例。佈局

2.WindowManager繼承了ViewManager,有幾個重要的接口:post

  •  addView,在窗口中添加view,可動態使用,傳入參數有view和LayoutParams,view是要添加的視圖組件,LayoutParams是佈局參數,包括位置,大小,透明度,類別(type),flag等,type能夠指定添加的view類別,flag能夠指定其可控性(如touch able)。在addview後,view就會出如今窗口中。
  •    updateViewLayout(View view, ViewGroup.LayoutParams params),更新重畫視圖組件。
  •    removeView(View view),移除view。

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中處理。翻譯

相關文章
相關標籤/搜索