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 类 也是一个视图类,显示滑杆,滑块,并处理对应的滑动事件,略。
- Android学习 ——SystemUIService之SettingsUI分析
- Android学习——systemUIService 之PowerUI分析
- Android学习 ——SystemUIService之RingtonePlayer分析
- Android学习 ——SystemUIService之StorageNotification分析
- Android学习——systemUIService 类分析
- SystemUI源码分析一(SystemUIService的启动)
- android安全学习之6—signapk分析
- 【android学习之十二】——SDK实例NotePad 分析1
- 【android学习之十三】——SDK实例NotePad 分析2
- Android学习笔记之实现一个文档查看器(一)——应用分析
- 李兴华—JAVA学习之我见 分析!!!
- android 学习之---listview adapter分析
- Android Service学习之IntentService 深入分析
- Android Service学习之IntentService 深入分析
- Android Service学习之IntentService 深入分析
- Android Service学习之IntentService 深入分析
- Android Service学习之IntentService 深入分析
- Android Service学习之IntentService 深入分析
- java实现MD5加密 MD5Util工具类
- Http请求
- 解决Android3.0以后不能使用butterknife问题
- Go并发
- Windows端部署Scala2.10.5开发环境
- Android学习 ——SystemUIService之SettingsUI分析
- java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类HashMap Hashtable LinkedHashMap 和TreeMap.
- vx使用时路由传参问题
- Error:No such property: zipAlignEnabled for class: com.android.build.gradle.internal.variant.Applica
- 最大类间方差法(大津法,OTSU)
- 《HTTP权威指南》学习笔记(8)第8章 集成点:网关、隧道及中继(关键词:计算机网络/HTTP/网关/隧道/中继)
- Mac OSX python 安装pandas numpy scrapy的问题
- 英文智能问答之OpenEphyra
- deep learning 专项课程二 第一单元选择题