Kennem's Blog
  • 🏠主页
  • 🔍搜索
  • 📚文章
  • ⏱时间轴
  • 🔖标签
  • 🗂️分类
  • 🙋🏻‍♂️关于
主页 » 📚文章

💻技术

NVM使用(Linux)

NVM使用(Linux) 在 Linux 上安装 nvm(Node Version Manager)的方法如下: 1. 安装 NVM 在 Linux 上,可以使用 curl 或 wget 安装 nvm。 方法 1:使用 curl(推荐) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash 方法 2:使用 wget wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash ⚠️ 注意: v0.39.4 是 nvm 最新稳定版,建议去 官方 GitHub 检查最新版本。 ...

2025-03-16 · 1 分钟 · 470 字 · updated: 2025-03-16 · ShowGuan

PowerShell 详细使用

PowerShell 详细使用 一、PowerShell 简介 PowerShell 是微软开发的一种命令行外壳和脚本语言,它基于 .NET 框架,不仅适用于 Windows 系统,也在 Linux 和 macOS 上提供支持。与传统的命令提示符相比,PowerShell 处理的是对象而非纯文本,使得数据传递和管理更为灵活高效。无论是日常管理任务还是复杂的自动化操作,PowerShell 都是非常强大的工具。 ...

2025-03-16 · 5 分钟 · 2159 字 · updated: 2025-03-16 · ShowGuan

ProtoBuf使用

ProtoBuf使用 1. ProtoBuf 简介 Protocol Buffers(简称 ProtoBuf) 是 Google 开发的一种语言无关、平台无关、可扩展的序列化结构化数据的机制。它主要用于数据的高效存储和传输,在分布式系统、RPC 框架、数据持久化等场景中非常常用。 ...

2025-03-16 · 3 分钟 · 1354 字 · updated: 2025-03-16 · ShowGuan

Conda使用

Conda使用 使 Conda 可以在 PowerShell 中使用 在 PowerShell 中启用 conda,通常需要确保 conda 的路径已添加到系统环境变量中。可以按照以下步骤操作: 1. 安装 Anaconda 或 Miniconda 如果你还没有安装 Anaconda 或 Miniconda,可以先去其官网下载安装包并进行安装: ...

2025-02-23 · 2 分钟 · 929 字 · updated: 2025-02-23 · ShowGuan

Android Studio 使用

Android Studio 使用 kotlin设置带空格的函数名 https://stackoverflow.com/questions/42485164/suppress-identifier-not-allowed-in-android 基本快捷键 Alt + F7 用途: 查找当前选中的符号的所有用法(Find Usages)。可以用于查看方法、类、变量等在代码中的引用位置。 Shift + F6 用途: 查找并重命名当前选中的元素(Find and Rename)。适用于重命名类、方法、变量等。 Ctrl + Shift + F 用途: 查找文件(Find Files)。用于在项目中快速搜索文件,支持正则表达式和文件路径筛选。 Ctrl + F 用途: 查找当前文件中的文本内容。常用于快速定位某个词或表达式。 Ctrl + Shift + N 用途: 查找并打开文件(Find and Open File)。可以通过文件名或部分文件名快速找到并打开文件。 Ctrl + Shift + A 用途: 查找并执行命令(Find Action)。用于快速执行任何 Android Studio 中的命令或操作。 Ctrl + B 用途: 跳转到定义(Go to Definition)。用于快速跳转到当前选中元素(如变量、方法、类等)的定义处。 Ctrl + Shift + I 用途: 查看当前选中元素的定义(Quick Definition)。用于查看变量、方法或类的定义,而不必跳转到定义的文件。 Ctrl + E 用途: 打开最近访问的文件(Recent Files)。通过此快捷键可以快速切换到最近打开的文件。 Ctrl + P 用途: 显示方法参数信息(Parameter Info)。在方法调用时,按下此快捷键可以查看该方法的参数类型和顺序。 编辑相关快捷键 Ctrl + D 用途: 复制当前行或选中的代码行(Duplicate Line)。可以快速复制一行代码。 Ctrl + Y 用途: 删除当前行(Delete Line)。删除当前光标所在的行。 Ctrl + / 用途: 注释/取消注释当前行(Comment/Uncomment Line)。用于快速注释或取消注释单行代码。 Ctrl + Shift + / 用途: 块注释/取消块注释(Block Comment/Uncomment)。可以对选中的多行代码进行块注释或取消块注释。 Ctrl + Alt + L 用途: 格式化代码(Reformat Code)。根据项目的代码风格自动调整代码的格式。 Ctrl + Shift + Up/Down 用途: 向上/向下移动当前行(Move Line Up/Down)。可以将当前代码行向上或向下移动。 Alt + Enter 用途: 显示意图操作(Show Context Menu)。根据光标所在位置显示相关的快速修复建议或操作。 Ctrl + Shift + V 用途: 粘贴最近的剪贴板内容(Paste from History)。可以选择最近的多个剪贴板内容进行粘贴。 调试相关快捷键 F8 用途: 步过当前代码行(Step Over)。在调试时,执行当前行并跳过任何方法调用。 F7 用途: 步入当前方法(Step Into)。在调试时,进入当前行调用的方法中。 Shift + F8 用途: 步出当前方法(Step Out)。在调试时,跳出当前方法并返回到调用它的地方。 Ctrl + F5 用途: 重新运行调试(Rerun Debugger)。在调试时,重新启动调试会话。 Alt + F9 用途: 运行到光标位置(Run to Cursor)。将程序执行跳到光标所在行。 项目管理快捷键 Alt + 1 用途: 打开项目视图(Project View)。快速打开项目结构视图,查看和管理项目文件。 Alt + 4 用途: 打开运行窗口(Run Window)。用于查看构建、运行过程中的日志和输出。 Ctrl + Shift + F12 用途: 切换最大化/恢复编辑窗口(Maximize/Restore Editor)。在多个窗口之间切换编辑区域的显示状态。

2025-02-15 · 3 分钟 · 1318 字 · updated: 2024-02-15 · ShowGuan

Android 代码架构设计

Android 代码架构设计 代码分层设计 VC-P 内存泄漏 MVP可以解决内存泄漏的问题 把原来的UI逻辑抽象成View接口,把原来的业务逻辑抽象成Presenter接口,model还是原来的model ...

2025-02-15 · 1 分钟 · 121 字 · updated: 2024-02-15 · ShowGuan

Android 第三方库

Android 第三方库 ARouter ARouter 是阿里巴巴推出的 Android 路由框架,用于简化页面跳转、组件通信和跨模块开发。 1. 添加依赖 首先,在项目中引入 ARouter 的相关依赖。 1.1 在项目级 build.gradle 中添加 ARouter Maven 仓库 buildscript { repositories { mavenCentral() google() maven { url '<https://jitpack.io>' } } } 1.2 在模块级 build.gradle 中添加依赖 ...

2025-02-15 · 5 分钟 · 2442 字 · updated: 2024-02-15 · ShowGuan

Android 网络请求解析数据

网络请求解析数据 Pull方式解析XML数据 /** * pull 解析 xml */ class MainActivity5 : AppCompatActivity() { private val mBinding by lazy { ActivityMain5Binding.inflate(layoutInflater) } private fun sendRequestWithOkHttp() { thread{ try { val client = OkHttpClient() val request = Request.Builder() .url("<http://10.0.2.2/get_data.xml>") .build() val response = client.newCall(request).execute() val responseData = response.body?.string() if (responseData != null){ parseXMLWithPull(responseData) } }catch (e: Exception){ e.printStackTrace() } } } private fun parseXMLWithPull(xmlData: String) { try { val factory = XmlPullParserFactory.newInstance() val xmlPullParser = factory.newPullParser() xmlPullParser.setInput(StringReader(xmlData)) var eventType = xmlPullParser.eventType var id = "" var name = "" var version = "" while (eventType != XmlPullParser.END_DOCUMENT) { val nodeName = xmlPullParser.name when (eventType) { // 开始解析某个节点 XmlPullParser.START_TAG -> { when (nodeName) { "id" -> id = xmlPullParser.nextText() "name" -> name = xmlPullParser.nextText() "version" -> version = xmlPullParser.nextText() } } // 完成解析某个节点 XmlPullParser.END_TAG -> { if ("app" == nodeName) { Log.d("MainActivity", "id is $id") Log.d("MainActivity", "name is $name") Log.d("MainActivity", "version is $version") } } } eventType = xmlPullParser.next() } } catch (e: Exception) { e.printStackTrace() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(mBinding.root) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } mBinding.sendRequestBtn.setOnClickListener { Log.d("MainActivity", "发送请求 ") sendRequestWithOkHttp() } } } ...

2025-02-15 · 2 分钟 · 936 字 · updated: 2024-02-15 · ShowGuan

Android(7)

Android(7) Ordered broadcasts Normal broadcasts 接受广播系统 发送一条广播,可以被不同的广播接收者所接受,广播接收者收到广播之后,再进行逻辑处理。 收发标准广播 发送广播的Activity class BroadStandardActivity : AppCompatActivity() { lateinit var standardReceiver: BroadcastReceiver private val mBinding: ActivityBroadStandardBinding by lazy { ActivityBroadStandardBinding.inflate(layoutInflater) } @SuppressLint("UnspecifiedRegisterReceiverFlag") override fun onStart() { super.onStart() standardReceiver = StandardReceiver() // 创建一个意图过滤器,只处理ACTION_STANDARD的广播 val filter = IntentFilter(StandardReceiver.ACTION_STANDARD) registerReceiver(standardReceiver, filter) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(mBinding.root) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } mBinding.button.setOnClickListener { val intent: Intent = Intent(StandardReceiver.ACTION_STANDARD) intent.apply { putExtra("data", "standard") } sendBroadcast(intent) } } override fun onStop() { super.onStop() // 注销接收器 unregisterReceiver(standardReceiver) } } 接受广播的Receiver class StandardReceiver : BroadcastReceiver() { companion object { const val TAG = "StandardReceiver" const val ACTION_STANDARD = "com.zhouguan.learnbroadcasts.action.standard" } override fun onReceive(context: Context?, intent: Intent?) { if (intent != null && intent.action.equals(ACTION_STANDARD)) { Log.d(TAG, "onReceive: ${intent.extras?.getString("data")}") } } } 接受有序广播 通过设置接收器的优先级来控制顺序 ...

2025-02-15 · 3 分钟 · 1494 字 · updated: 2025-02-15 · ShowGuan

Jetpack Compose(1)

Jetpack Compose(1) Jetpack Compose是用于构建原生Android界面的新工具包。它可简化并加快Android上的界面开发,帮助使用更少的代码、强大的工具和只管的Kotlin API,快速打造生动而精彩的应用。 Compose的优势 更少的代码 使用更少的代码实现更多的功能,并且可以避免各种bug,从而使代码简洁且易于维护 直观 只需要描述界面,Compose会负责处理剩余的工作。应用状态变化时,界面会自动更新 加快应用开发 兼容现有的所有代码,方便随时随地使用。借助实时预览和全面的Android Studio支持,实现快速迭代。 功能强大 凭借对Android平台API的直接访问和对于Material Design,深色主题、动画等的内置支持,创建精美的应用。 可组合函数 Jetpack Compose 是围绕可组合函数构建的。这些函数可以让你以程序化定义应用的界面,只需描述应用界面的外观并提供数据项,而不必关注界面的构建过程(初始化元素,将其附加到父项等)。如需创建可组合函数,只需将@Composable注解添加到函数名称中即可。 ...

2025-02-15 · 7 分钟 · 3083 字 · updated: 2024-02-15 · ShowGuan

Jetpack Compose(2)

Jetpack Compose(2) Compose中布局的目标 实现高性能 让开发者能够轻松编写自定义布局 在Compose中,通过避免多次测量布局子级可实现高性能。如果需要进行多次测量,Compose具有一个特殊系统,即固有特性测量。 标准布局组件 使用Column可将多个项垂直地放置在屏幕上 使用Row可以将多个项水平地放置在屏幕上 使用Box可以将一个元素放在另一个元素上 修饰符 修饰符的作用类似于基于视图的布局中的布局参数,借助修饰符,可以修饰或扩充可组合项。 ...

2025-02-15 · 2 分钟 · 727 字 · updated: 2024-02-15 · ShowGuan

Jetpack基础

Jetpack基础 ViewModel class MainViewModel(countReserved: Int) : ViewModel() { val userLiveData = MutableLiveData<User>() private val userIdLiveData = MutableLiveData<String>() val userName: LiveData<String> = userLiveData.map { user -> "${user.firstName} ${user.lastName}" } val user: LiveData<User> = userIdLiveData.switchMap { userId -> Repository.getUser(userId) } val count: LiveData<Int> get() = _count val _count = MutableLiveData<Int>() init { _count.value = countReserved } fun plusOne() { val count = _count.value ?: 0 _count.value = count + 1 } fun clear() { _count.value = 0 } // fun getUser(userId: String): LiveData<User> { // return Repository.getUser(userId) // } fun getUser(userId: String) { userIdLiveData.value = userId } } Lifecycles 可以在Observer中查看到对应MainActivity声明周期的变化 ...

2025-02-15 · 2 分钟 · 570 字 · updated: 2024-02-15 · ShowGuan

Lopper & Handler

Lopper & Handler Looper 是 Android 中用于线程消息循环的核心组件,它让线程可以接收和处理消息(Message)或任务(Runnable)。它通过一个消息队列(MessageQueue)来管理这些消息和任务,线程从中取出消息逐一处理。 在Android中: ...

2025-02-15 · 2 分钟 · 648 字 · updated: 2024-02-15 · ShowGuan

MaterialDesign

MaterialDesign

2025-02-15 · 1 分钟 · 1 字 · updated: 2024-02-15 · ShowGuan

adb使用

adb使用 Android Debug Bridge (ADB) 最常用命令 以下是开发中使用频率最高的 ADB 命令及其用途: 1. 检查设备连接 adb devices 列出已连接的设备及其状态。 2. 安装与卸载应用 安装 APK: ...

2025-02-15 · 2 分钟 · 566 字 · updated: 2025-02-15 · ShowGuan
« 上一页  下一页  »
© 2026 Kennem's Blog · Powered by Hugo & PaperMod
👤 Visitors: 👀 Views: