Android学习 ——SystemUIService之SettingsUI分析

来源:互联网 发布:音频提取软件apk 编辑:程序博客网 时间:2024/05/23 20:45

SettingsUI.java 并不是 “设置” 相关 的  而仅仅是 “亮度设置” 。类名夸大了类作用

还是先从入口start()

public void start() {        IntentFilter filter = new IntentFilter();        filter.addAction(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG);        mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, null, mHandler);    }

可见入口仅仅是注册了ACTION_SHOW_BRIGHTNESS_DIALOG  广播监听,指定了 mIntentReceiver  处理事件

查看mIntentReceiver 实现

    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            String action = intent.getAction();            if (action.equals(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG)) { // 显示亮度控制对话框  广播                if (DEBUG) Log.d(TAG, "showing brightness dialog");                if (mBrightnessDialog == null) { // 如果没有创建对话框就生成                    mBrightnessDialog = new BrightnessDialog(mContext);                    mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {                        @Override                        public void onDismiss(DialogInterface dialog) {                            mBrightnessDialog = null;                        }                    });                }                if (!mBrightnessDialog.isShowing()) { // 如果没显示就显示对话框                    mBrightnessDialog.show();                }            } else {                Log.w(TAG, "unknown intent: " + intent);            }        }    };
在事件广播中实现的是对话框的创建,以及显示相关的逻辑

这其中涉及到 BrightnessDialog 类 ,进入该类可知其继承系统的Dialog类 并实现了 BrightnessController.BrightnessStateChangeCallback协议,这里又涉及到BrightnessController暂且不论。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

BrightnessDialog 是视图类,主要作用函数在其初始化函数及生命周期函数中

初始化函数public BrightnessDialog(Context ctx) {        super(ctx);        Resources r = ctx.getResources();        mBrightnessDialogLongTimeout =                r.getInteger(R.integer.quick_settings_brightness_dialog_long_timeout);        mBrightnessDialogShortTimeout =                r.getInteger(R.integer.quick_settings_brightness_dialog_short_timeout);    }

在初始化函数中仅仅是设置了长超时时间和短超时时间

onCreate()

public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //创建一个窗口        Window window = getWindow();        window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);        window.getAttributes().privateFlags |=                WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;        window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);        window.requestFeature(Window.FEATURE_NO_TITLE);         setContentView(R.layout.quick_settings_brightness_dialog);        setCanceledOnTouchOutside(true); // 点击外部消失    }
在onCreate 函数中 创建了一个窗口,并设置显示对话视图,同时实现点击外界让窗口消失

onStart()

protected void onStart() {        super.onStart();        mBrightnessController = new BrightnessController(getContext(),                (ImageView) findViewById(R.id.brightness_icon),                (ToggleSlider) findViewById(R.id.brightness_slider));        dismissBrightnessDialog(mBrightnessDialogLongTimeout);        mBrightnessController.addStateChangedCallback(this); 设置当前为状态改变的会回调    }
在onStart()函数中 实例化对象mBrightnessController(参数 imageview 和 ToggleSlide) ,引入新的自定义类ToggleSlide,暂且不论

// 执行之前先移除之前的事件,在执行当前事件    private void dismissBrightnessDialog(int timeout) {        removeAllBrightnessDialogCallbacks();        mHandler.postDelayed(mDismissDialogRunnable, timeout);    }

状态改变的触发函数为

// 正常情况下,弹出后在一定时间内就会自动消失,但是如果用户操作改变了亮度等级,就改变了自动超时    // 触发的时间,所以先取消之前的定时,在执行新的定时    public void onBrightnessLevelChanged() {        dismissBrightnessDialog(mBrightnessDialogShortTimeout);    }

BrightnessDialog 类是为了管理对话框视图层的显示,消失,时间控制等(mvc 的 v)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

BrightnessController 类

    public BrightnessController(Context context, ImageView icon, ToggleSlider control) {        mContext = context;        mIcon = icon;        mControl = control;        mHandler = new Handler();        // 实现抽象类的抽象方法 多用户        mUserTracker = new CurrentUserTracker(mContext) {            @Override            public void onUserSwitched(int newUserId) {                updateMode();                updateSlider();            }        };        // 创建一个观察,观察亮度变化        mBrightnessObserver = new BrightnessObserver(mHandler);        mBrightnessObserver.startObserving();        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();        mAutomaticAvailable = context.getResources().getBoolean(                com.android.internal.R.bool.config_automatic_brightness_available);        mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));        // Update the slider and mode before attaching the listener so we don't receive the        // onChanged notifications for the initial values.        updateMode();        updateSlider();// ToggleSlider 滑动条设置当前 brightnessController 为监听者        control.setOnChangedListener(this);    }
   // 添加     public void addStateChangedCallback(BrightnessStateChangeCallback cb) {        mChangeCallbacks.add(cb);    }    // 移除     public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {        return mChangeCallbacks.remove(cb);    }
BrightnessController 中实现 了ToggleSlide 的接口onChange(),当ToggleSlide的触发滑动改变时,所有已监听成员对应改变

 toggleSlider的接口实现    public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {        setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC                : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);        updateIcon(automatic);        if (!automatic) {            final int val = value + mMinimumBacklight;            setBrightness(val);            if (!tracking) {                AsyncTask.execute(new Runnable() {                        public void run() {                            Settings.System.putIntForUser(mContext.getContentResolver(),                                    Settings.System.SCREEN_BRIGHTNESS, val,                                    UserHandle.USER_CURRENT);                        }                    });            }        }        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {            cb.onBrightnessLevelChanged();        }    }

BrightnessController 类是为了处理改变事件的监听,及需要触发其他监听者回调,监听的添加移除等逻辑 (mvc 的 c)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ToggleSlider 类 也是一个视图类,显示滑杆,滑块,并处理对应的滑动事件,略。


阅读全文
0 0
原创粉丝点击