8-1 操作系统究竟是个什么玩意?

操作系统作为计算机软件系统的管理者,通过API提供服务,协调资源分配。它与应用程序间通过API函数交互,实现软件分工,提升整体效率。C库函数是对API的封装,使其更易用。不同平台的API和库函数存在差异,影响软件的可移植性。操作系统的重要性在于定义了软件开发的层次结构,使得复杂产品的开发更加模块化。

八、一些杂散但值得讨论的问题

8.1.1 像人类社会一样的计算机软件系统(有些人只埋头干活,有些人只做管理)

(1)人类社会最开始时人人都干活,这时候没有专业分工,所有人都直接做产生价值的工作。当时是合适的,因为当时生产力低下,人口稀少。这就像裸机程序一样(裸机程序的特点是:代码量小,功能简单、所有代码都和直接目的有关,没有服务性代码)。
(2)后来人口增加生产力提高,有一部分人脱离了直接产生价值的体力劳动专职指挥(诞生了阶级)。本质上来说是合理的,因为资源得到了更大限度的使用,优化了配置,提升了整体效率。程序也是一样,当计算机技术发展,计算机性能和资源大量增加,这时候写代码也要产生阶级也要进行分工,不然如果所有代码都去参加直接性的工作,则整体系统效率不高。(因为代码很难进行资源的优化配置)。
(3)解决方案就是操作系统。操作系统就是分出来的管理阶级,操作系统的代码本身并不直接产生价值,它的主要任务是管理所有资源,它主要为直接产生价值、直接劳动的那行程序(各种应用程序)提供服务。所有操作系统既是管理者也是服务者。
(4)裸机程序就好像小公司,操作系统下的程序就好像大型跨国公司:裸机程序就好像小国家,操作系统下程序就好像大国家;如果我们要做一个产品,软件系统到底应该是裸机还是基于操作系统呢?本质上取决于产品本身的复杂度。只有极简单的功能、使用极简单的CPU(譬如单片机)的产品才会选择用裸机开发;一般的复杂性产品都会基于操作系统来开发。

8.1.2 操作系统的调用通道:API函数

(1)操作系统负责管理和资源调配,应用程序负责具体的直接劳动,它们之间的接口就是API函数。当应用程序需要使用系统资源(譬如内存、譬如CPU、譬如硬件操作)时就通过API向操作系统发出申请,然后操作系统响应申请帮助应用程序执行功能。

8.1.3 C库函数和API的关系

(1)单纯的API只是提供了极简单没有任何封装的服务函数,这些函数应用程序是可用的,但是不太好用。应用程序为了好用,就对这个API进行了二次封装,把它变得好用一些,于是就成了C库函数。
(2)有时完成一个功能,有相应的库函数可以完成,也有API可以完成,用哪个都行。譬如读写文件,API的接口是open write read close;库函数的接口是fopen fwrite fread fclose.fopen本质上是使用open实现的,只是进行了封装。封装肯定有目的(添加缓冲机制)。

8.1.4 不同平台(windows、Linux、裸机)下库函数的差异

(1)不同操作系统API是不同的,但是都能完成所有的任务,只是完成一个任务所调用的API不同。
(2)库函数在不同操作系统下也不同,但是相似性要更高一些,这是人为的,因为人下意识想要屏蔽不同操作系统的差异,因此在封装API成库函数的时候,尽量使用了同一套接口,所以封装出来的库函数挺像的。但是还是有差异,所以在一个操作系统上写的应用程序不可能直接在另一个操作系统上面编译运行。于是乎就有个可移植性出来了。
(3)跨操作系统可移植平台,譬如QT,譬如JAVA语言。

8.1.5 操作系统的重大意义:软件体系分工

(1)有了操作系统后,我们做一个产品可以首先分成2部分:一部分人负责做操作系统(开发驱动的);一部分人负责用操作系统实现具体功能(开发应用)。实际上上层应用层的功能进一步复杂化后又分了好多层。

<think>我们注意到用户的问题是关于如何使用代码创建TimePicker,而不是使用XML布局。因此,我们需要调整回答,完全使用代码来实现自定义,包括设置滚轮模式、自定义颜色等,并确保多版本一致性。 同时,用户对之前的回答中大量使用XML表示不满,因此本次回答将完全使用代码(Kotlin/Java)来实现。 步骤: 1. 使用代码创建TimePicker,并添加到布局中。 2. 设置滚轮模式(针对不同版本处理)。 3. 自定义数字颜色、按钮颜色等(通过反射或查找资源ID方式,注意版本兼容)。 4. 处理不同系统版本显示一致性问题(使用Material主题,或者通过代码设置样式)。 注意:由于系统TimePicker内部视图结构可能因版本和厂商而异,代码操作视图可能不够稳定,但我们可以尽量提供通用方法。 另外,我们也要考虑深色模式等。 最后,如果用户需要高度一致性,建议使用第三方库,但这里我们主要展示系统TimePicker的代码创建和自定义。 我们将使用Kotlin示例,并尽量兼容低版本。</think>您的问题非常合理,我将完全使用代码方式创建和自定义 TimePicker,无需 XML 布局。以下是纯代码实现方案: ### 完全代码实现的 TimePicker 自定义(Kotlin 示例) ```kotlin // 在 Activity/Fragment 中创建 TimePicker val timePicker = TimePicker(this).apply { layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ) // 强制滚轮模式 (API 21+) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { timePickerMode = TimePicker.MODE_SPINNER } // 设置初始时间 hour = 9 minute = 30 // 自定义颜色 - 核心方法 setCustomColors(ContextCompat.getColor(this@context, R.color.custom_number), ContextCompat.getColor(this@context, R.color.custom_button)) }.also { // 添加到父容器 (findViewById<ViewGroup>(android.R.id.content)).addView(it) } /** * 自定义 TimePicker 颜色的扩展方法 */ fun TimePicker.setCustomNumbersColor(textColor: Int, buttonColor: Int) { // 1. 修改数字颜色 (兼容 4.1+) try { val hourView = findViewById<TextView>(Resources.getSystem().getIdentifier("hour", "id", "android")) val minuteView = findViewById<TextView>(Resources.getSystem().getIdentifier("minute", "id", "android")) val amPmView = findViewById<TextView>(Resources.getSystem().getIdentifier("amPm", "id", "android")) hourView?.setTextColor(textColor) minuteView?.setTextColor(textColor) amPmView?.setTextColor(textColor) } catch (e: Exception) { Log.e("TimePicker", "数字颜色修改失败: ${e.message}") } // 2. 修改按钮颜色 (API 21+) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { try { val okButton = findViewById<Button>(Resources.getSystem().getIdentifier("ok", "id", "android")) val cancelButton = findViewById<Button>(Resources.getSystem().getIdentifier("cancel", "id", "android")) okButton?.setTextColor(buttonColor) cancelButton?.setTextColor(buttonColor) } catch (e: Exception) { Log.e("TimePicker", "按钮颜色修改失败: ${e.message}") } } // 3. 修改选中项颜色 (API 21+) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setBackgroundColor(ContextCompat.getColor(context, R.color.background)) setHighlightColor(ContextCompat.getColor(context, R.color.highlight)) } } // 使用示例 timePicker.setCustomNumbersColor(Color.RED, Color.BLUE) ``` ### 多版本兼容处理 ```kotlin /** * 确保滚轮模式在所有版本一致 */ fun ensureSpinnerMode(timePicker: TimePicker) { // 5.0+ 使用标准API if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { timePicker.timePickerMode = TimePicker.MODE_SPINNER } // 4.4及以下版本处理 else { try { val spinnerClass = Class.forName("com.android.internal.widget.TimePickerSpinnerDelegate") val delegateField = TimePicker::class.java.getDeclaredField("mDelegate") delegateField.isAccessible = true if (!spinnerClass.isInstance(delegateField.get(timePicker))) { delegateField.set(timePicker, null) // 清除旧代理 timePicker.setIs24HourView(true) // 触发重新创建代理 } } catch (e: Exception) { Log.e("TimePicker", "强制滚轮模式失败: ${e.message}") } } } ``` ### 关键实现说明 1. **纯代码创建**:直接实例化 `TimePicker` 并添加到视图树 2. **滚轮模式**: - API 21+ 使用 `timePickerMode = MODE_SPINNER` - 旧版本通过反射强制使用 `TimePickerSpinnerDelegate` 3. **颜色自定义**: - 通过资源ID查找数字/按钮视图 - 使用 `setTextColor()` 直接修改 4. **版本兼容**: - 使用 `Build.VERSION.SDK_INT` 分级处理 - 关键操作添加 try-catch 防止崩溃 ### 备选方案(完全控制) 如需更稳定的自定义效果,推荐代码集成 Material 组件: ```kotlin // build.gradle 添加依赖 implementation 'com.google.android.material:material:1.6.0' // 代码创建 MaterialTimePicker val timePicker = MaterialTimePicker.Builder() .setTimeFormat(TimeFormat.CLOCK_24H) .setHour(12) .setMinute(30) .setTheme(R.style.CustomTimePicker) // 完全自定义主题 .build() ``` > **注意**:系统 TimePicker 内部实现在不同 OEM 厂商设备上差异很大,纯代码修改可能不稳定。对于生产环境,建议使用 Material Design 组件或第三方库如 `MaterialDateTimePicker` 实现 100% 可控的自定义效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值