八大排序-及复杂度
View 是用户界面基本构建块之一,View类是Android中各种组件的基类,如View是ViewGroup基类。它是一个可见的矩形区域,用于显示应用程序中的内容和与用户进行交互。View 可以包含其他 View 或 ViewGroup,并且可以具有自己的属性、样式和行。
Android中的UI组件都由View、ViewGroup组成。
Android 提供了许多内置的 View 类,如 TextView(文本视图)、Button(按钮)、ImageView视图)等。
View分类
单一视图: 即一个View,如TextView, 不包含子View
视图组: 即多个View组成的ViewGroup,如LinearLayout, 包含子View
1、设计布局
2、初始化视图。
3、设置事件监听器
4、更新视图
5、布局和绘制
6、性能优化
1、调用 setContentView() 方法设置布局或在 XML 布局文件中定义视图层次结构。
2、系统会解析布局文件并创建相应的 View 对象,形成一个视图树(View Hierarchy)。
3、在 Activity 或 Fragment 的生命周期方法中调用 onCreate()、onStart 和 onResume()` 方法后,系统会开始绘制视图。
4、系统从根视图开始遍历整个视图树,并依次调用每个 View 的 draw() 方法进行绘制。
5、在 draw() 方法中,View 会先绘制自身的内容,然后递归地绘制它的子视图。
6、绘制过中,系统会将每个 View 的绘制结果保存到一个称为 Canvas 的画布对象中。
7、最后,系统将 Canvas 中的绘制结果显示在屏幕上。
使用退出标志使线程正常退出。
使用stop()方法强行终止线程,但是这个方法不推荐使用,因为stop()和suspend()、resume()一样,都是作废过期的方法,使用它们可能发生不可预料的结果。
使用interrupt()方法中断线程。
程序需要退出或者终止:当程序需要退出或者终止时,需要停止所有的线程,释放资源。
资源被占用:当线程运行时占用了某些资源,而其他线程需要使用这些资源时,需要停止线程来释放这些资源。
等待超时:当线程等待某个事件的发生,但是等待时间超过了预定的时间,需要停止线程并执行下一步操作。
线程已经完成任务:在某些情况下,线程已经完成了它的任务,不再需要继续运行,需要停止线程并释放资源。
线程出现异常:当线程发生异常时,需要停止线程以避免出现不一致的状态。
程序性能不佳:当线程的运行影响了程序的性能或者导致程序崩溃时,需要停止线程以避免这种情况的发生。
当你在手机上输入一个URL并按下访问按钮时,一系列复杂的网络交互就开始了。以下是一个简化的过程描述:
解析URL:首先,浏览器会解析你输入的URL,确定协议类型(如HTTP或HTTPS)、域名、路径等信息。
DNS查询:浏览器需要将域名转换成IP地址才能进行通信。因此,它会发起一个DNS(Domain Name System,域名系统)查询,以获取网站服务器的IP地址。如果本地缓存或操作系统缓存中没有对应的记录,那么请求就会转发给ISP(Internet Service Provider,互联网服务提供商)的DNS服务器,直到找到正确的IP地址。
建立连接:一旦获取了IP地址,浏览器就会尝试通过TCP/IP协议栈与服务器建立连接。这包括三次握手过程,以确认双方可以开始传输数据。
发送HTTP/HTTPS请求:连接建立后,浏览器会发送一个HTTP(或HTTPS)请求到服务器,请求包含你想要访问的资源的URL、浏览器信息、接受的内容类型等信息。
服务器处理请求:服务器接收到请求后,会根据请求的内容来处理,可能是返回一个静态页面,或者是动态生成内容。如果是动态内容,可能还会涉及数据库查询或其他后台处理。
响应客户端:处理完成后,服务器会发送一个HTTP响应给浏览器,响应中包含了状态码(例如200表示成功)、响应头信息(如内容类型)以及网页的内容本身。
接收并渲染页面:浏览器接收到响应后,开始解析HTML文档,并逐步构建DOM树。然后根据CSS样式表来布局页面元素,并执行JavaScript代码,最终呈现出完整的网页给用户。
加载其他资源:HTML页面中可能会包含图片、脚本文件、样式表等其他资源。浏览器会继续发送请求来获取这些资源,并将其加载到页面中。
完成加载:当所有的资源都加载完毕后,浏览器会认为页面已经完全加载,并显示一个加载完成的提示。
观察者模式的关键组成部分:
在Android平台上,提供了一种共享内存的机制——Ashmem。该机制内部其实复用了Linux的共享内存机制。Ashmem机制使用linux的mmap系统调用,可以将同一段物理内存映射到不同进程各自的虚拟地址空间,从而实现高效的进程间共享。
实现:
1、进程A创建并打开一个文件(可以是设备文件/dev/ashmem),得到一个文件描述符fd.
2、通过mmap调用将fd映射成内存映射文件。在mmap调用中指定参数用于标识创建的是共享内存。
3、进程B打开同一个文件,也得到一个文件描述符,这样A和B就打开了同一个文件。
4、进程B也要用mmap调用指定参数表示想使用共享内存,并传递打开的fd。这样A和B就通过打开同一个文件并构造内存映射,实现进程间内存共享。
JNI(Java Native Interface)是Java提供的一种编程框架,用于实现Java代码与本地(Native)代码(如C、C++等)之间的交互。JNI允许Java应用程序调用本地代码,并且本地代码可以调用Java代码,实现更高性能的操作或访问底层资源。
JNI主要用途-工作原理-调用java的方法
SQL
基础语法
2.1、java kotlin 混合使用,同时使用 Glide 图片加载项目会失败。
解决: 现在是java写了一个调用GlideApp 的函数, kotlin 调用该函数。 不直接调用GlideApp,是因为注解的原因,不能同时支持java 和kotlin 只能支持一个。目前先以这种方式解决
2.2、kotlin application 工程调用library 工程里的xml,的layout。找不到
直接用 kotlin-android-extensions 插件的id 的方式,debug 模式没问题,release 编译的时候,就一直提示找不到 控件:
命令-shell原理
基于 webview 技术:微信小程序的运行环境基于 webview 技术,即在微信客户端内置了一个浏览器内核,用于加载和运行小程序的代码。
运行时环境:微信提供了一个小程序的运行时环境,包括了 js 引擎,渲染引擎等,用于解析和执行小程序的代码,并将结果显示在微信客户端中。具体请看官网
开发框架:微信提供了一个开发小程序的框架,包括了一系列的 API 和组件,开发者可以使用这些 API 和组件来构建小程序的界面和功能。
受限环境:由于小程序运行在微信客户端,因此受到了一定的安全限制和运行环境的限制,例如无法直接访问手机系统的一些功能,如联系人、相册等。
数据存储和网络请求:小程序可以通过微信提供的 API 来进行数据的存储和网络请求,可以将数据保存在本地缓存中,也可以通过网络请求获取远程数据。
框架和渲染引擎的交互:开发者编写的小程序通过框架解析后生成相应的渲染树,最终由渲染引擎将渲染树转换为用户可见的页面。
小程序本质是一个单页应用,所有的页面渲染和事件处理,都在一个页面内进行,但是又可以通过微信客户端调用原生的各种借口。
它的架构是,数据驱动的架构模式,它的 UI 和数据是分离的,所有的页面的更新,都需要通过数据的更改来实现
采用 js + wxml + wxss 三种技术开发
功能分为 webview 和 appService 两个部分,webview 负责展示 UI,appService 来处理业务逻辑和数据、接口调用,两个部分分别在两个线程中运行,通过 WxJSBridge 实现通信。
对称加密就是通过同一个“密钥”,将明文加密成密文,并且也能把密文解密成明文。引用对称加密之后,即使数据被截获,由于黑客不知道密钥是什么,因此就无法解密,不知道请求的内容。
密钥生成:首先,Alice需要生成一个秘密密钥。这个密钥可以是随机生成的一串字节,其长度取决于所选的加密算法。例如,如果他们使用AES-128,那么密钥就应该是128位(或16字节)。
加密消息:然后,Alice使用这个密钥和加密算法(如AES)对她想要发送的消息进行加密。
密钥共享:为了让Bob能够解密这个消息,Alice需要找到一种安全的方式把密钥传给他。这可能需要另外的安全通信渠道(比如直接口头告知,小声点不要被人听到,因为我们要发送的是私㊙消息,防止被人窃取),或者他们之前就已经共享过密钥。
解密消息:Bob收到加密的消息和密钥后,就可以使用相同的加密算法和密钥对消息进行解密,从而获得原始的明文消息。
优点
效率高:对称加密算法比非对称加密算法快得多。
简单易用:对称加密很容易实施,只需要管理一个密钥。
缺点
密钥分发问题:对称加密的最大问题是如何安全地将密钥传输给接收者。如果密钥在传输过程中被截获,那么加密的信息就可能被解密和滥用。
发送者使用接收者的公钥对消息进行加密,只有使用匹配的私钥才能解密这些消息。因此,即使攻击者截获了加密消息,他们也无法解密它,除非他们有接收者的私钥。
注意:每次生成的RSA密钥对都会不一样
每次生成的RSA密钥对都会不一样
密钥对生成:首先,Bob需要生成一对公钥和私钥。私钥必须保密,而公钥可以公开。
公钥共享:然后,Bob把他的公钥发送给Alice。因为即使公钥被别人获取,没有对应的私钥,他们也无法解密经过公钥加密的信息,所以这个步骤不需要额外的安全通信渠道。
加密消息:Alice收到Bob的公钥后,就可以用它来加密她想要发送的消息。
解密消息:Alice将加密的消息发送给Bob,只有Bob可以使用他的私钥对消息进行解密。
优点
安全性高:由于公钥可以公开分发,因此不需要像对称加密那样安全地传输密钥。
缺点
效率低:相比对称加密,非对称加密的速度较慢。
复杂性高:非对称加密需要更复杂的管理和实施。
SharedPerference
Preferences 从其保存数据的结构来分析,这是一个相对较轻量级的存储数据 的方法。类似于我们常用的 ini 文件保存软件初始化设置,同样在 Android 平台常用于 存储较简单的参数设置。
例如,可以通过它保存上一次用户所作的修改或者自定义参数 设定,当再次启动程序后依然保持原有的设置。通过Context.getSharedPreferences()方法 来读写数值,这个方法通过设置 name 来使得同一个程序内的其它模块共享数据。
文件存储
可以在设备本身的存储设备或者外接的存储设备中 创建用于保存数据的文件。同样在默认的状态下,文件是不能在不同的程序间共享。
[按位置分为 内存,与 外存]
[Internal Storage 内存]
把数据持久化存储到手机内部存储空间。他主要用于私有数据存储。
[External Storage外寸]
把数据持久化存储到手机外部SD卡中。他主要用于非隐秘数据存储
SQLite数据库
Databases在 Android API 中包括了应用 SQLite databases 的接口。
【每个程序所创建的数据库都是私有的,换句话说,程序间无法相互访问对方的数据库】。
在程序中创建 SQLiteDatabase 对象,其中包含了大部分与 database 交互的方法,例如:读 取数据或者管理当前数据。可以应用 SQLiteDatabase 和其 subClassSQLiteOpenHelper 的 create()方法来创建新的数据库。
Network Connection 网络连接(存储)
Network 通过网络来获取和保存数据资源,这个方法需要设备保持网络连接状态,所以相对存在一些限制。下面列出了两个用于相关操作的类:Java.net.* android.net.*
ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间仍未能得到有效响应或者响应时间过长,都会造成ANR。
1、Android 应用程序通常是运行在一个单独的线程(例如,main)里。这意味着你的应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发 ANR 对话框,因为你的应用程 序并没有给自己机会来处理输入事件或者 Intent 广播。
2、因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity 应该在它的关键
生命周期方法(如 onCreate()和 onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用 Thread.wait()或是 Thread.sleep()。替代的方法是,主线程应该为子线程提供一个 Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将 能保证你的主线程保持对输入的响应性并能避免由于 5 秒输入事件的超时引发的 ANR 对话框。这种做法应该在其它显示 UI 的线程里效仿,因为它们都受相同的超时影响。
3、IntentReceiver 执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保 存设定或者注册一个Notification。和在主线 程里调用的其它方法一样,应用程序应该避 免在 BroadcastReceiver 里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver 的生命周期短),替代的是,如果响应 Intent 广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。顺便提及一句,你也应该避免在IntentReceiver 里启动一个 Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应 Intent 广播时需要向用户展示什么,你应该使用 Notification Manager 来实现。
4、增强响应灵敏性
一般来说,在应用程序里,100 到 200ms 是用户能感知阻滞的时间阈值。因此,这里有一些 额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。
如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar 和 ProgressDialog 对这种情况来说很有用)。
特别是游戏,在子线程里做移动的计算。
如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个 SplashScreen 或者快 速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。