当前位置: 首页 > news >正文

安卓面试问题记录

目录

  • 1. JNI和NDK
    • 1.谈谈你对JNI和NDK的理解
    • 2.简要的JNI调用过程:
  • 2. 线程、同步、异步
    • 1.Java创建线程的方式有几种?start()方法和 run()方法的区别
    • 2.Handler 机制和原理
    • 3.为什么在子线程中创建Handler会抛异常?
    • 4.Android中的ANR的解决方法
    • 5.intentservice有什么优点?
    • 6.okhttp异步请求流程
    • 7.Okhttp的同步请求
  • 3. UI
    • 1.谈谈你对 Bitmap 的理解,什么时候应该手动调用 bitmaprecycle():
    • 2.Android布局的五个常见类型:
  • 4. 组件
    • **1.Android四大组件是指Activity、Service、BroadcastReceiver和ContentProvider**。
  • 5. 四大组件详解
      • 1. **activity**
      • **2 .service**
      • **3 .content provider**
      • **4 .broadcast receiver**
    • 如果后台的activity由于某种原因被系统回收了,如何在被系统回收之前保存当前状态?
  • 6. 机制
    • 1.view的事件分发机制
  • 7. 性能
    • 1.GC是什么,为什么要有GC
  • 8. 数据库
    • 1.SQLite 数据库升级——新增字段处理

1. JNI和NDK

1.谈谈你对JNI和NDK的理解

答:JNI(Java Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C、C++)之间的交互。它允许Java代码调用本地代码(Native Code)并与其进行数据交换。
NDK(Native Development Kit)是Android提供的一个工具集,用于在Android应用中使用本地代码。它包含了一系列的工具和库,可以将C、C++代码编译成与特定平台相关的本地库文件(例如.so文件),然后通过JNI将这些本地库文件嵌入到Android应用中。
JNI和NDK的关系是,JNI提供了Java与本地代码交互的机制,而NDK则提供了将本地代码集成到Android应用中的工具和库。通过JNI和NDK,开发者可以在Android应用中使用C、C++等本地语言编写高性能、底层的功能模块,比如图像处理、音频处理、加密算法等。
使用JNI和NDK可以带来以下优势:
1.性能优化:某些计算密集型任务,使用本地代码可以提高执行效率。
2.跨平台开发:通过使用本地代码,可以在不同平台上共享代码和库。
3.重用现有代码:如果已经有了C、C++等语言的现有代码,可以通过JNI和NDK将其集成到Android应用中,避免重复开发。
需要注意的是,在使用JNI和NDK时,需要谨慎处理内存管理、类型转换和异常处理等问题,以确保代码的正确性和稳定性。

2.简要的JNI调用过程:

1、**编写本地代码:**首先,需要编写包含所需功能的本地代码,通常是用C或C++编写。这些本地代码将被编译成共享库(.so文件)。
2、创建JNI接口:在Java代码中,需要声明与本地代码对应的JNI接口。这些接口方法将与本地代码中的函数进行绑定,以便在Java中调用。
3、生成头文件:使用Java Development Kit(JDK)中的工具javah,生成包含JNI接口方法定义的头文件。
4、实现JNI接口:在本地代码中,需要实现JNI接口中声明的方法。这些方法将提供与Java代码之间的桥梁,使得Java可以调用本地代码。
5、编译本地代码:使用C/C++编译器将本地代码编译成共享库(.so文件)。
6、将共享库加载到应用程序:在Android应用程序中,可以使用System.loadLibrary()方法加载共享库。
7、调用JNI方法:在Java代码中,通过调用JNI接口中声明的方法来调用本地代码。可以使用native关键字标记这些方法。
8、运行应用程序:在应用程序运行时,当Java代码调用JNI方法时,将触发与本地代码的交互,完成相应的功能操作。
需要注意的是,JNI调用涉及到本地代码的编写和编译,因此需要对C/C++有一定的了解。此外,在JNI调用过程中,需要注意内存管理和数据类型转换等问题,以确保安全性和正确性。
JNI调用过程包括编写本地代码、创建JNI接口、生成头文件、实现JNI接口、编译本地代码、加载共享库、调用JNI方法等步骤,通过这些步骤可以实现Java代码与本地代码之间的交互

2. 线程、同步、异步

1.Java创建线程的方式有几种?start()方法和 run()方法的区别

答:在Java中,有两种主要的方式可以创建线程
1.继承Thread类:通过继承Thread类并重写其run()方法来创建线程。首先,创建一个继承自Thread的子类,并在子类中实现run()方法来定义线程的具体逻辑。然后,通过创建子类的实例对象,并调用其start()方法来启动线程。
2.实现Runnable接口:通过实现Runnable接口来创建线程。首先,创建一个实现了Runnable接口的类,并在该类中实现run()方法。然后,创建Thread类的实例对象,将实现了Runnable接口的类的实例作为参数传递给Thread的构造函数。最后,调用Thread对象的start()方法来启动线程。

区别

  • 使用继承Thread类的方式,线程的逻辑直接写在子类中的run()方法中,但这样会限制了子类的继承关系。
  • 使用实现Runnable接口的方式,线程的逻辑在实现了Runnable接口的类中定义,可以更灵活地共享代码和资源,并且避免了单继承的限制。

关于start()方法和run()方法的区别

  • start()方法用于启动线程并异步执行线程的逻辑。调用start()方法后,系统会为线程分配资源并调用线程的run()方法。
  • run()方法是线程的入口点,可以将线程的具体逻辑在run()方法中实现。但直接调用run()方法并不会启动新的线程,而是在当前线程中同步执行run()方法的代码块。

总结来说,Java创建线程的方式有继承Thread类和实现Runnable接口。start()方法用于启动线程并异步执行线程的逻辑,而run()方法是线程的入口点,在调用start()方法后由系统自动调用

2.Handler 机制和原理

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。

基础概念

  • UI线程
    主线程 ActivityThread ,主线程也是Ui线程,应用启动的时候会启动一个ui线程
  • Handler
    负责发送消息和处理消息。
  • Looper
    负责消息循环,循环取出 MessageQueue 里面的 Message,并交给相应的 Handler 进行处理。
  • MessageQueue
    消息队列,用来存放通过Hangdler 发送的消息,按照先进先出的顺序取出消息,内部使用的是单链表结构(

相关文章:

安卓面试问题记录

目录 1. JNI和NDK1.谈谈你对JNI和NDK的理解2.简要的JNI调用过程:2. 线程、同步、异步1.Java创建线程的方式有几种?start()方法和 run()方法的区别2.Handler 机制和原理3.为什么在子线程中创建Handler会抛异常?4.Android中的ANR的解决方法5.intentservice有什么优点?6.okhtt…...

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码: package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…...

听力词汇笔记(6级)

2022年9月六级 1.personality traits:人格特征 2.all of this notwithstanding:尽管如此 3.come under:受到 4.scrutiny:关注 5.highly responsive to:对....高度敏感 6.preteen year:青春期前 7.susceptible to:受....影响 8.take sharp preced…...

【JVM】详细解析java创建对象的具体流程

目录 一、java创建对象的几种方式 1.1、使用new关键字 1.2、反射创建对象 1.2.1、Class.newInstance创建对象 1.2.2、调用构造器再去创建对象Constructor.newInstance 1.3、clone实现 1.4、反序列化 二、创建对象的过程 2.1、分配空间的方式 1、指针碰撞 2、空闲列表 …...

kafka怎么用代码读取数据

Kafka可以通过Java语言中的Kafka客户端库来读取数据。以下是一个简单的Java代码示例,通过Kafka Consumer API从Kafka集群中读取数据: java import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.…...

网关与路由器的区别

仅需2分钟,彻底明白网关的工作原理_哔哩哔哩_bilibili网关_百度百科 一、网关的概念 网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域…...

助力工业物联网,工业大数据之工单事实指标需求分析【二十】

文章目录 1:工单事实指标需求分析2:工单事实指标构建 1:工单事实指标需求分析 目标:掌握DWB层工单事实指标表的需求分析 路径 step1:目标需求step2:数据来源 实施 目标需求:基于工单信息统计等…...

python_PyQt5开发工具结构基础

写在前面: 考虑已经陆陆续续在平台写了几篇PyQt5开发的小工具,后续还会继续发布新的新工具,这些工具都基于一个基础结构往上构建,这个基础结构是本人自己开发的习惯,在这里把工具的基础结构代码抽取出来,后…...

【C++】入门基础2

引用 概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间 类型& 引用变量名(对象名) 引用实体; 注意:引用类型必须和引用实体是…...

Reinforcement Learning with Code 【Chapter 8. Value Funtion Approximation】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…...

常用InnoDB参数介绍

常用InnoDB参数介绍 1 状态参数1.1 InnoDB 缓冲池状态监控1.1.1 Innodb_buffer_pool_pages_total1.1.2 Innodb_buffer_pool_pages_data1.1.3 Innodb_buffer_pool_bytes_data1.1.4 Innodb_buffer_pool_pages_dirty1.1.5 Innodb_buffer_pool_bytes_dirty1.1.6 Innodb_buffer_pool…...

云原生网关部署新范式丨 Higress 发布 1.1 版本,支持脱离 K8s 部署

作者:澄潭 版本特性 Higress 1.1.0 版本已经 Release,K8s 环境下可以使用以下命令将 Higress 升级到最新版本: kubectl apply -f https://github.com/alibaba/higress/releases/download/v1.1.0/customresourcedefinitions.gen.yaml helm …...

【通讯录】--C语言

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

通过两种实现方式理解CANoe TC8 demo是如何判断接收的以太网报文里的字段的

假设有一个测试用例,需求是:编写一个测试用例,发送一条icmpv4 echo request报文给DUT,identifier字段设置为10。判断DUT能够回复icmpv4 echo reply报文,且identifier字段值为10。 实现:在canoe的simulation setup界面插入一个test节点,ip地址为:192.168.0.1,mac地址为…...

Mysql- 存储引擎

目录 1.Mysql体系结构 2.存储引擎简介 3.存储引擎特点 InnoDB MyISAM Memory 4.存储引擎选择 1.Mysql体系结构 MySQL整体的逻辑结构可以分为4层: 连接层:进行相关的连接处理、权限控制、安全处理等操作 服务层:服务层负责与客户层进行…...

vite / nuxt3 项目使用define配置/自定义,可以使用process.env.xxx获取的环境变量

每日鸡汤:每个你想要学习的瞬间,都是未来的你向自己求救 首先可以看一下我的这篇文章了解一下关于 process.env 的环境变量。 对于vite项目,在我们初始化项目之后,在浏览器中打印 process.env,只有 NODE_ENV这个变量&…...

在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils

Binutils 是GNU(https://www.gnu.org/)提供的一组二进制工具的集合。通常,在已经安装了Linux操作系统的个人电脑上,系统就已经自带了这个工具集。但在进行嵌入式开发的时候,可能会用到支持ARM64平台的Binutils,这时就需要用到交叉编译。 此前,在【1】我们已经介绍过Ubun…...

SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化

Sentinel数据持久化 前面介绍Sentinel的流控、熔断降级等功能,同时Sentinel应用也在面临着一个问题:我们在Sentinel后台管理界面中配置了一堆流控、降级规则,但是Sentinel一重启,这些规则全部消失了。那么我们就要考虑Sentinel的持…...

pytest中conftest的用法以及钩子基本使用

一、conftest是什么? conftest是pytest进阶中的高级应用,最近正好用到这一块儿,研究之后,向大家分享该高级应用。 二、使用步骤 1.conftest代码块 以全局性使用driver为主,只启动一次浏览器: pytest.fi…...

数据结构---顺序栈、链栈

特点 typedef struct Stack { int* base; //栈底 int* top;//栈顶 int stacksize //栈的容量; }SqStack; typedef struct StackNode { int data;//数据域 struct StackNode* next; //指针域 }StackNode,*LinkStack; 顺序栈 #define MaxSize 100 typedef struct Stack { int*…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...