面经:安卓学习笔记
文章目录
- 1. Android系统架构
- 2. Activity
- 2.0 定义
- 2.1 生命周期
- 2.2 生命状态
- 2.3 启动模式
- 3. Service
- 3.1 定义
- 3.2 两种启动方式
- 3.3 生命周期
- 3.4 跨进程service
- 3.5 IntentService
- 4. BroadCastReceiver
- 4.1 概念
- 4.2 组成
- 4.3 广播接收器的分类
- 4.4 生命周期
- 4.5 静态注册和动态注册
- 5. ContentProvider
- 6. Intent
- 6.1 作用
- 6.2 显示Intent和隐式Intent
- 7. Fragment
- 7.1 定义作用
- Demo分析
- 1. 监听电量变化
- 2. 监听开机启动
- 总结:组件知识
- 界面
- 通信
- 存储
- 资源
- 其他
- ADB工具使用
TODO:放个壳在这里 内容后续加
1. Android系统架构

- Linux内核层
Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。 - 系统运行库层
这一层通过一些C/C++库为Android系统提供了主要的特性支持。如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等。在这一层还有Android运行时库,它主要提供了一些核心库,允许开发者使用Java语言来编写Android应用。另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个Android应用都能运行在独立的进程中,并且拥有一个自己的虚拟机实例。相较于Java虚拟机,Dalvik和ART都是专门为移动设备定制的,它针对手机内存、CPU性能有限等情况做了优化处理。 - 应用框架层
这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者可以使用这些API来构建自己的应用程序。 - 应用层
所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者是你从Google Play上下载的小游戏,当然还包括你自己开发的程序。
核心总结
框架中各层作用
1、内核层:包含大量驱动;同时可让Android利用主要安全功能(系统和内核安全)。
2、HAL:提供标准接口,屏蔽硬件差异。
3、C/C++系统库:Android基础功能库。主要包括init孵化来的用户空间的守护进程
Android Runtime:安卓应用的基础环境。
4、系统系统框架层:连接应用层,为上层提供基础功能接口。
5、系统应用层:包含各类应用,负责与用户进行交互。
通过进程分析各层之间的联系
1、 Loader层上电,加载预设参数,准备启动内核层的swapper进程。
2、 内核层中swapper进程启动,加载驱动、启动Kthreadd线程、准备启动Init进程。
3、 C++框架层启动Init进程,Init加载各类服务,同时开启最重要的Zygote进程。
4、 Java 框架根据启动的Zygote进程,fork出system server进程。
5、 应用层根据启动的system server进程开启应用。
2. Activity
2.0 定义
Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕
2.1 生命周期

onCreate():会在系统首次创建Activity时触发
onStart():当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持互动做准备
onResume():
Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一Activity,或设备屏幕关闭。当发生中断事件时,Activity 进入“已暂停”状态,系统调用 onPause() 回调。如果 Activity 从“已暂停”状态返回“已恢复”状态,系统将再次调用 onResume() 方法。因此应实现 onResume(),以初始化在 onPause() 期间释放的组件,并执行每次 Activity进入“已恢复”状态时必须完成的任何其他初始化操作。
onPause()
系统将此方法视为用户将要离开您的 Activity 的第一个标志(尽管这并不总是意味着 Activity 会被销毁);此方法表示 Activity 不再位于前台。
onStop()
如果您的 Activity 不再对用户可见,说明其已进入“已停止”状态,因此系统将调用 onStop() 回调。
在 onStop() 方法中,应用应释放或调整在应用对用户不可见时的无用资源。例如,应用可以暂停动画效果,或从精确位置更新切换到粗略位置更新。
进入“已停止”状态后,Activity 要么返回与用户互动,要么结束运行并消失。如果 Activity 返回,系统将调用 onRestart()。如果 Activity 结束运行,系统将调用 onDestroy()。
onDestroy()
销毁 Activity 之前,系统会先调用 onDestroy()。
2.2 生命状态
运行状态:位于返回栈栈顶
暂停状态:不再位于栈顶,但是仍然可见
停止状态:不再位于栈顶,并且完全不可见
销毁状态:从返回栈中移除
2.3 启动模式
- standard模式(默认)
每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard 模式的Activity,系统不会在乎这个Activity 是否已经在返回栈中存在,每次启动都会创建一个该Activity 的新实例。

- singleTop 模式
当Activity 的启动模式指定为singleTop ,在启动Activity 时如果发现返回栈的栈顶已经是该Activity ,则认为可以直接使用它,不会再创建新的Activity 实例。

- singleTask
当Activity 的启动模式指定为singleTask ,每次启动该Activity 时,系统首先会在返回栈中检查是否存在该Activity 的实例,如果发现已经存在则直接使用该实例,并把在这个Activity 之上的所有其他Activity 统统出栈,如果没有发现就会创建一个新的Activity 实例。

- singleInstance
指定为singleInstance 模式的Activity 会启用一个新的返回栈来管理这个Activity (其实如果singleTask 模式指定了不同的taskAffinity ,也会启动一个新的返回栈)

3. Service
3.1 定义
服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。
3.2 两种启动方式
(1)通过startService和stopService方式启动和停止服务
(2)通过bindService和unbindService的方式启动和停止服务
3.3 生命周期

- startService()生命周期
onCreate():当Service第一次被创建时,由系统调用
onStartCommand(): 当调用startService方法启动Service时被调用
onDestroy():当service不再使用时,由系统调用 - bindService()生命周期
onBind():当bindService方法启动Service时被调用
onUnbind(): 当unbindService方法解除绑定时被调用
3.4 跨进程service
通过aidl实现c/s提供服务接口流程
(1)服务端Service
Service端提供暴露服务端接口的aidl文件
创建aidl文件,在接口包内添加服务端的接口
创建完毕后立刻编译
service代码文件:MyService.java
继承aidl的接口代替非跨进程调用中service使用bind接口,在onBind中返回该接口实例
AndroidManifest.xml
注册服务并设置Inten过滤器
(2)客户端Client
添加aidl文件
文件的路径、包名、接口名都需要一致
MainActivity.java
剩余部分和正常的bindService中MainActvity的流程基本一致:创建对应的binder(跨进程调用就是对应的aidl接口),创建ServiceConnected实例并重写onServiceConnected和onServiceDisconnected方法,以及MainActivity中的剩余的应有逻辑。
3.5 IntentService
IntentService是 Scrvice 的子类,增加了额外的功能。
Service存在的问题
Service不会专门启动一个单独的进程,Service和它所在的应用在同一个进程中。Service不是一条新的线程,因此不应该在Service中直接处理耗时的任务,会阻塞主线程,造成ANR(程序无响应)异常。
IntentService的优点
IntentService会创建单独的worker线程来处理所有的Intent请求。 在执行耗时操作时,不会阻塞主线程,更不会产生ANR。 IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,所以不用处理多线程问题,执行完毕后会自行调用onDestroy()方法进行关闭。
4. BroadCastReceiver
4.1 概念
BroadCast Receiver(广播接收者)使用了设计模式中的观察者模式(基于消息的发布/订阅事件模型),用于响应来自其他应用程序或者系统的广播消息,是一个全局监听器。
4.2 组成
1)消息订阅者(广播接收者): 广播接收者通过 Binder机制在AMS注册
2)消息发布者(广播发布者): 广播发送者通过 Binder 机制向AMS发送广播
3)消息中心(AMS,即Activity Manager Service): AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者,AMS将广播发送到合适的广播接收者相应的消息循环队列中。 广播接收者通过消息循环拿到此广播,并回调 onReceive()
4.3 广播接收器的分类
-
标准广播
是一种完全异步执行的广播,通过context. senddBroadcast(intent)方法发送。在广播发出后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序,这种广播的效率较高,并且不能被拦截。
-
有序广播
是一种同步执行的广播,通过context. sendOrderedBroadcast(intent)方法发送。在广播发出之后,同一时刻只有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递(通过setResult()方法传递,通过getResult()方法接收)。即广播接收器有先后顺序,优先级高(在receiver的intent-filter中的android:priority属性设置)的广播接收器可以先收到广播消息,且前面的广播接收器还可以截断正在传递的广播(通过abortBroadcast()方法丢弃),这样后面的广播接收器就无法收到广播消息。
-
本地广播
上述俩种广播是全局广播,所有应用均可收到,而本地广播仅在进程内传播,有保护数据安全的作用。调用者不同,本地广播调用的是LocalBroadcastManager相关方法,全局广播调用的是Context的相关方法。且本地广播没有静态注册的方法。 -
系统广播
Andrroid内置了多个系统广播。使用系统广播时,只需在注册广播接收者时定义相关的action即可。
4.4 生命周期
BroadcastReceiver的生命周期从对象调用它开始,到onReceiver方法执行完成之后结束。
每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。如果我们在Activity中注册了BroadcastReceiver,当Activity销毁时要主动撤销注册(即添加onDestroy方法),否则会出现异常。
4.5 静态注册和动态注册
案例学习:监听电池电量变化,Android四大组件——BroadcastReceiver——动态注册和静态注册 - 虞美人体重90 - 博客园 (cnblogs.com)
https://www.cnblogs.com/Xiang-MY/p/16191383.html
动态注册:广播接收器可以自由的控制注册与取消,具有灵活性。因为其生命周期与对应的Acitivity的生命周期是一致的,所以只有在应用程序启动后才能收到广播。
静态注册:在AndroidManifest.xml中进行注册。静态注册的广播不受程序生命周期的影响,当应用程序关闭后,仍可以接收到广播
动态注册的BroadcastReceiver可以自由控制注册和注销,但必须在程序启动之后才能接收广播,因为注册的逻辑是写在onCreate()中的。
静态注册的BroadcastReceiver可以在程序未启动的情况下也能接收广播。
5. ContentProvider
ContentProvider主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使用ContentProvider是Android实现跨程序共享数据的标准方式。
6. Intent

Android开发 - Intent和Broadcast Receiver - guqiangjs - 博客园 (cnblogs.com)
https://www.cnblogs.com/guqiangjs/p/5932612.html
6.1 作用
Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端
6.2 显示Intent和隐式Intent
显式Intent
对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
隐式Intent
隐式的Intent提供了一种机制,可以让匿名的应用程序组件响应动作请求。这意味着可以要求系统启动一个可执行给定动作的Activity,而不必知道需要启动哪个应用程序或者Activity。
例如希望让用户从应用程序中拨打电话,那么可以实现一个新的拨号程序,也可以使用一个隐式的Intent来请求一个在电话号码(表示为一个URI)上执行动作。
7. Fragment
Fragment详解之一——概述_fragment启舰_启舰的博客-CSDN博客
https://blog.csdn.net/harvic880925/article/details/44917955
7.1 定义作用
Fragment是一种可以嵌入在Activity当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛
Demo分析
1. 监听电量变化
新建一个类,让它继承BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑可在该方法中处理。(广播的动态注册)
监听电量变化的广播还需要打开权限:
package com.java.androidstudy;import androidx.appcompat.app.AppCompatActivity;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//我们要收听的频道是:电量变化IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);//电量变化,想监听什么广播,就添加相应的action//创建接收者BatteryLeveReceiver batteryLeveReceiver = new BatteryLeveReceiver();//动态注册广播this.registerReceiver(batteryLeveReceiver,intentFilter);}//第一步,创建一个广播接收者,继承自BroadcastReceiverprivate class BatteryLeveReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//在这里写接收到广播后的逻辑处理String action = intent.getAction();Log.d(TAG,"收到了电量变化的广播,action is ==>"+action);Log.d(TAG,"当前电量:"+intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0));//获取电量,可戳进BatteryManager的源代码看看}}//取消广播注册,否则会造成内存卡顿@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(batteryLeveReceiver);}
效果展示:
运行后,在模拟器上拖动电量:

2. 监听开机启动
静态注册
//第一步:新建BootCompleteReceiver类
public class BootCompleteReceiver extends BroadcastReceiver {private static final String TAG="BootCompleteReceiver";@Overridepublic void onReceive(Context context, Intent intent) {//第三步,收到开机广播后做的事情String action = intent.getAction();Log.d(TAG,"action is =="+action);Log.d(TAG,"开机完成");Toast.makeText(context,"收到开机完成的广播",Toast.LENGTH_SHORT).show();//静态注册,不需要启动程序也可以接收到广播,不需要取消注册。}
}
然后,我们需要在AndroidManifest.xml文件中标签内进行开机广播的静态注册。
<receiver android:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><!-- 第二步,静态注册action --><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter></receiver>
此外,我们还需要打开开机广播的权限
现在运行程序后重启模拟器,日志截图如下:

总结:组件知识
界面
Activity —— Android最基本的界面容器,用于显示所有APP的内容
Fragment—— Android碎片化界面容器,用于嵌入显示APP指定内容
Layout文件 —— 布局文件,与Activity,Fragment,Adapter,自定义View一起使用,用于绘制界面布局和内容
Adapter —— 界面适配器。用于为重复显示组件如ListView GridView等组件编写列表项显示内容和显示逻辑
控件类 —— 主要是设置各种控件的事件监听器,如OnClickListener等
容器类 —— LinearLayOut,RelativeLayout,FrameLayout,ScrollView等
组件类 —— Button,TextView,EditText,ImageView等
列表类 —— ListView,GridView,RecycleView等
通信
Intent —— 传递数据的容器,主要用于Activity,Fragment界面跳转以及广播发送和接收等数据传递行为中。
ContentProvider —— 内容共享者,主要用于跨应用来获取其他应用的数据或者数据库。
存储
SharedPreference —— 通过key-value键值对的形式来保存数据,适合小量数据
SQLite —— 数据库,用于本地存储大量数据
资源
String —— 存储全局字符串, 通常将所有字符串资源都存放在string中
Dimen —— 主要用于保存控件的各类尺寸。一般将全局尺寸写在dimen中
Mipmap —— 主要用于存储各种应用的各种图标资源文件
Drawable —— 要勇于存储图片,shape和selector等图像资源。图像可以通过各种dpi来区分分辨率以达到不同分辨率视频的效果。
Color —— 存储全局颜色值,便于进行统一更改。
Assest —— 存放静态资源,如html页面等。
其他
Service —— 后台服务
Application —— 全局应用对象
Mainfest —— android项目配置菜单文件,用于注册和配置activity,service等,用于配置权限和应用设置选项。
ADB工具使用
添加链接描述
启用ADB服务: adb start-server
关闭ADB服务: adb kill-server
使用指定ADB设备:adb -s , 为adb devices获得的序列号,如上图:lcc77709
设置端口转发为5555: adb tcpip 5555
开启网络调试:adb connect xxx.xxx.xxx.xxx:5555。xxx.xxx.xxx.xxx为手机局域网IP
断开网络调试:adb disconnect xxx.xxx.xxx.xxx:1234
使用usb连接: adb usb
使用root模式: adb root
重启设备: adb reboot
关机: adb shell reboot -p。
重启到rec模式(fb模式): adb reboot recovery(fastboot)
查看已连接的设备信息:adb devices
查看adb 版本信息:adb version
查看日志:adb logcat
列出手机装的所有app 的包名:adb shell pm list packages
列出系统应用的所有包名:adb shell pm list packages -s
相关文章:
面经:安卓学习笔记
文章目录 1. Android系统架构2. Activity2.0 定义2.1 生命周期2.2 生命状态2.3 启动模式 3. Service3.1 定义3.2 两种启动方式3.3 生命周期3.4 跨进程service3.5 IntentService 4. BroadCastReceiver4.1 概念4.2 组成4.3 广播接收器的分类4.4 生命周期4.5 静态注册和动态注册 5…...
Java设计模式:四、行为型模式-06:观察者模式
文章目录 一、定义:观察者模式二、模拟场景:观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案:观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…...
vscode中讨厌的蓝色波浪线的去除小trick和原理
问题描述 不小心“设置同步”时和远程电脑的合并(merge)了,然后就出现了这个问题!烦死了!!! 大概是这个样子: 解决办法 站在了巨人的肩膀上,在下图位置输入这样一行参数&…...
开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿
近期换了工作电脑,公司的IT团队不够给力,不能复制电脑系统,所以又到了需要重装IDE配置开发环境的时候了;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题,这里整理下解决方法以备不时之需; …...
AcWing 787:归并排序
【题目来源】https://www.acwing.com/problem/content/789/【题目描述】 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。【输入格式】 输入共两行,第一行包含整数 n。 第二行包含 n 个整数&#…...
SeamlessM4T—Massively Multilingual Multimodal Machine Translation
本文是LLM系列的文章,针对《SeamlessM4T—Massively Multilingual & Multimodal Machine Translation》的翻译。 SeamlessM4T:大规模语言多模态机器翻译 摘要1 引言2 多模态翻译的社会技术维度2.12.22.3 3 SeamlessAlign:自动创建语音对…...
Python数据分析-Numpy
Numpy 个人笔记,仅供参考,谢谢 导入 import numpy import numpy as np from numpy import *Numpy数组对象 引入 # 让列表1 a [1,2,3,4],b [4,5,6,7] [x1 for x in a] # 实现ab a b > [1,2,3,4,5,6,7,8] [x y for (x,y) in zip(a,b)] -------…...
【真题解析】系统集成项目管理工程师 2023 年上半年真题卷(案例分析)
本文为系统集成项目管理工程师考试(软考) 2023 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)案例分析(问答题*4)试题一试题二试题三试题四案例分析(问答题*4) …...
【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)
一、SH for Glossy transport 1.Diffuse PRT回顾 上篇我们介绍了PRT,并以Diffuse的BRDF作为例子分析了预计算的部分,包括Lighting和Light transport,如上图所示。 包括我们还提到了SH,可以用SH的有限阶近似拟合球面函数ÿ…...
金蝶云星空二开,公有云执行SQL
功能背景; 金蝶公有云执行sql工具,因官方为云部署 用户无法连接数据库增删改查 天梯维护网页仅支持增删改操作 二开单据已支持根据sql动态生成单据体 与sql可视化界面操作一致 功能实现及场景: 1.可用于公有云执行sql类操作 2.私有云部署&am…...
JAVA String 二维的字符串数组 String[][]
String[][] 表示一个二维的字符串数组,也可以称为字符串矩阵。它是由多个一维的字符串数组组成的,每个一维数组都表示矩阵中的一行。 在 Java 中,可以使用如下方式声明和初始化一个二维字符串数组: String[][] matrix new Strin…...
【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
el-dialog设置高度、使用resetFields清除表单项无效问题
初学者容易踩坑的的el-dialog、el-form问题 1. el-dialog设置高度2. el-form中表单项对不齐3. 使用resetFields清除表单项无效 1. el-dialog设置高度 在el-dialog中里面添加一个div设置固定高度,或者限制最小的高度。 <el-dialogtitle"选择图标"v-mod…...
MySql切换到达梦数据库,各种问题解决记录
参考官方文档: https://eco.dameng.com/document/dm/zh-cn/sql-dev/practice-func.html 1. 关键字导致的报错:如ref,comment,top,domain等 Error -2007: 第 1 行, 第 117 列[ref]附近出现错误: 语法分析出错解决方案:修改关键字即可 2. 查…...
2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆
2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆...
vscode中使用eslint+prettier的配置
eslintprettiervscode自动保存用起来感觉非常爽快。 一般来说,安装eslintprettier插件,然后使用相关脚手架配套的eslintprettier,无法自动格式代码,每次都需要执行格式化命令。这里贴出保存自动格式化代码的setting.json。 // .…...
HTML 标签讲解
HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup (标记、标签)用来容纳和描述内容 严格意义上,标签是指开始标签…...
ue5 小知识点 ue的world type,pie editor game
说明以该命令行模式启动游戏的前提下的两个问题: 1.WITH_EDITOR中的代码会被编译 2.由于没有在编辑器中(即没有打开虚幻编辑器),所以GIsEditor为false WITH_EDITOR和WITH_EDITORONLY_DATA的区别 在论坛中找到的答案: WITH_EDITORONLY_DAT…...
两表union 如何保证group by 字段唯一
当要计算的指标可能来源多个表时,可能会使用到union all把不同的表中计算的指标合起来。关于union all使用条件:两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致) 另外,回顾union和uni…...
【⑰MySQL】 变量 | 循环 | 游标 | 处理程序
前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL变量 | 循环 | 游标 | 处理程序的分享✨ 目录 前言1. 变量1.1系统变量1.2 用户变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构3.2 循环结构3.3 跳转…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
