• WindowManager massge和handler


    在一个可移动浮动按钮的demo源码学习中,有一些WindowManager的使用,在此做下总结。

    1.翻译过来就是窗口管理,是和应用框架层的窗口管理器交互的接口,通过

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

    可以获得它的实例。

    2.WindowManager继承了ViewManager,有几个重要的接口:

    •  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),它就等待,并在接收到命令后,按照你的要求来完成。

    handler可以定时发送massage,在这个demo中handler的postDelayed接口经常被调用,跟踪源码发现,其最终调用了sendMessageAtTime。

    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中处理。

  • 相关阅读:
    rinex4.0
    基于 Android NDK 的学习之旅目录
    基于设计模式的学习之旅目录
    基于设计模式的学习之旅中介者(附源码)
    基于设计模式的学习之旅观察者模式(附源码)
    基于设计模式的学习之旅责任链(附源码)
    基于设计模式的学习之旅访问者模式(附源码)
    基于设计模式的学习之旅状态模式(附源码)
    基于设计模式的学习之旅命令模式(附源码)
    基于设计模式的学习之旅享元模式(附源码)
  • 原文地址:https://www.cnblogs.com/nwxueyu-up/p/3204974.html
Copyright © 2020-2023  润新知