您的位置:首页 > 产品设计 > UI/UE

Android学习 ——SystemUIService之SettingsUI分析

2017-11-21 15:33 453 查看
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协议,这里又涉及到[b]BrightnessController暂且不论。[/b]

[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]---------------------[b]---------------------[b]--[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
[/b]

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)
-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]-----------------------[b]---------------------[b]---------------------[b]--[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
[/b]

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)


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: