Android面试复习(Android篇二)

本文全面介绍了Android应用开发的关键技术,包括广播机制、数据存储方案、内容提供器、服务及网络通信等内容。深入探讨了广播注册与类型、数据存储类型与操作、内容提供器功能、服务生命周期及网络请求方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.广播

1.1注册广播的两种方式

  • 动态注册让它继承自BroadcastReceiver,并重写父类的onReceive()方法即可。动态注册广播接收器一定要取消注册才可以。且必须要在程序启动之后才能接收到广播,灵活性比较好
  • 静态注册可以使用户不用启动程序即可接受广播。

1.2广播的类型

  • 标准广播:能够被其他应用程序接收到,且同时到达多个广播接收器
  • 有序广播:能够被其他应用程序接收到,按照设置的优先级前面的广播可以将后面的广播截断。

1.3本地广播

本地广播使用LocalBroadcastManager对广播进行管理,使得在这个机制下发出的广播只能在应用程序内部传递,并且广播接收器也只能接收来自内部的广播。

2数据存储方案

2.1数据存储类型

  • 文件存储:不对存储的内容进行任何格式化的处理,只适合于一些简单的文本文件或者二进制文件
  • SharedPreferences存储:使用键值对的方式存储数据并且可以支持多种不同的数据类型存储。l例如存储的是整型,那么读取出来的也是整型
  • SQlite数据库存储:是Android内置的关系型数据库,可以使用其来进行比较复杂的关系进行存储

数据库的操作:创建和升级,增删改查。
2.1.1 创建表和索引
  为了创建表和索引,需要调用 SQLiteDatabase 的 execSQL() 方法来执行 DDL 语句。如果没有异常,这个方法没有返回值。    例如,你可以执行如下代码:
db.execSQL("CREATE TABLE user(_id INTEGER PRIMARY KEY
AUTOINCREMENT, username TEXT, password TEXT);");

  这条语句会创建一个名为 user的表,表有一个列名为 _id,并且是主键,这列的值是会自动增长的整数。另外还有两列:username( 字符 ) 和 password( 字符 )。 SQLite 会自动为主键列创建索引。   通常情况下,第一次创建数据库时创建了表和索引。要 删除表和索引,需要使用 execSQL() 方法调用 DROP INDEX 和 DROP TABLE 语句。
2.1.2 添加数据 
有两种方法可以给表添加数据。
使用 execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。
execSQL() 方法适用于所有不返回结果的 SQL 语句。例如:
String sql = "insert into user(username,password) values ('finch','123456');//插入操作的SQL语句
db.execSQL(sql);//执行SQL语句

使用 SQLiteDatabase 对象的 insert()。
ContentValues cv = new ContentValues();
cv.put("username","finch");//添加用户名
cv.put("password","123456"); //添加密码
db.insert("user",null,cv);//执行插入操作

2.1.3 更新数据(修改)
使用SQLiteDatabase 对象的 update()方法。
ContentValues cv = new ContentValues();
cv.put("password","654321");//添加要更改的字段及内容
String whereClause = "username=?";//修改条件
String[] whereArgs = {"finch"};//修改条件的参数
db.update("user",cv,whereClause,whereArgs);//执行修改

该方法有四个参数:    表名;   列名和值的 ContentValues 对象;    可选的 WHERE 条件;    可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记,update() 根据条件,更新指定列的值. 
使用execSQL方式的实现
String sql = "update [user] set password = '654321' where username="finch";//修改的SQL语句
db.execSQL(sql);//执行修改

2.1.4 删除数据
①使用SQLiteDatabase 对象的delete()方法。
String whereClause = "username=?";//删除的条件
String[] whereArgs = {"finch"};//删除的条件参数
db.delete("user",whereClause,whereArgs);//执行删除

②使用execSQL方式的实现
String sql = "delete from user where username="finch";//删除操作的SQL语句
db.execSQL(sql);//执行删除操作

2.1.5 查询数据
* 使用 rawQuery() 直接调用 SELECT 语句
Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"finch"});
if(cursor.moveToFirst()) {
String password = c.getString(c.getColumnIndex("password"));
}

  返回值是一个 cursor 对象,这个对象的方法可以迭代查询结果。 如果查询是动态的,使用这个方法就会非常复杂。例如,当你需要查询的列在程序编译的时候不能确定,这时候使用 query() 方法会方便很多。
* 通过query实现查询
  query() 方法用 SELECT 语句段构建查询。   SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。   除了表名,其他参数可以是 null。所以代码可写成:
Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标
if(c.moveToFirst()){//判断游标是否为空
for(int i=0;i<c.getCount();i++){ 
c.move(i);//移动到指定记录
String username = c.getString(c.getColumnIndex("username");
String password = c.getString(c.getColumnIndex("password"));
}
}

2.1.6 使用游标
  不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:  
通过使用 getCount() 方法得到结果集中有多少记录; 
通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;
通过 getColumnNames() 得到字段名;
通过 getColumnIndex() 转换成字段号;
通过 getString(),getInt() 等方法得到给定字段当前记录的值;
通过 requery() 方法重新执行查询得到游标;
通过 close() 方法释放游标资源;
例如,下面代码遍历 user表:
Cursor result=db.rawQuery("SELECT _id, username, password FROM user");
result.moveToFirst();
while (!result.isAfterLast()) {
int id=result.getInt(0);
String name=result.getString(1);
String password =result.getString(2);
// do something useful with these
result.moveToNext();
}
result.close()

事务:事务的特性是保证让一系列的操作要么全部完成要么一个都完不成。首先开启事务,然后在异常捕获的代码快中去执行具体的操作,但所有操作都完成的时候表示事务已经执行成功了。
ACID事务 :指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

数据库的升级:可以使用判断当前数据库版本的方式,若是无就创建两个,若是有第一版则只更新第二版的内容不用将第一版的内容全部删掉再重写。

内容提供器

内容提供器:主要用于在不同程序间的实现数据共享功能,允许一个程序访问另一个程序的数据并且保证被访问数据的安全性。

读取其他程序中的程序:使用ContentResolverlei类,有增删改查等等方式,但和数据库不同的是,这里不指定表名而是指定一个Uri参数。Uri参数由权限加路径组成。权限一般采用程序宝名来命名。com.example.app.provider就可以,路径为table完整的Uri参数content://com.example.app.provider/table1.

创建自己的内容提供器
1. 使用ContentProvider类重写其中的六个方法onCreate(),query(),insert(),update(),delete(),getType().
2. 使用UriMacher这个类实现匹配内容Uri的功能,

getType()方法是每个内容提供器都必须提供的一个方法,用于获取Uri对象所对应的MIME类型,

3.服务

3.1多线程

可以继承Thread类,也可以实现Runable接口来定义一个线程或者使用匿名类的方式。

new Thread(new Runable(){
@Override
public run(){
}).start();

3.2在子线程更新UI

Android不允许在子线程中更新UI操作,但提供了一套异步消息处理机制解决了在子线程中更新UI操作的问题。

3.3异步消息处理机制

  1. Message: 在线程之间传递的消息,可以在内部之间携带少量信息,用于在不同程序之间交换数据。
  2. Handler: 用于发送和处理消息。
  3. MessageQueue: 消息队列,用于存放所有通过Handler发送的消息。
  4. Looper: 消息队列的管家,调用loop()方法,就会进入到一个无限循环当中只要发现MessageQueue有消就会将它取出发送到handleMessage()中去。

子线程更新UI流程:在主进程创建一个Handler对象,并重写handleMessage()方法,然后当子进程需要进行UI操作时就创建一个Message对象,并且通过Handler将信息发送出去。之后消息被添加到MessageQueue队列中等待操作,而Looper一直尝试从MessageQueue取出消息分发会HandleMessage()方法中,由于Handle是在主线程中创建的所以此时handleMessage()方法也会在主线程中运行。

3.4AsyncTask

AsyncTask是一个抽象类,必须创建一个一个子类去继承它,在继承时可以为AsyncTask类指定三个泛型参数。
1. Params: 执行AsyncTask所需要传入的参数,可用于在后台任务中使用。
2. Progress:在页面上显示的进度
3. Result: 任务执行完如果需要对结果进行返回就指定泛型作为返回类型。

重写AsyncTask的几个方法才能完成对任务的的定制。
1. onPreExecute(): 用于界面上的一些初始化操作,比如显示一个进度条等。
2. doInBackground(params):这个方法中的所有代码都会在子线程中运行,同样不能进行UI操作,如果需要更新UI则用publishProgress(Progress…)来完成。
3. onProgressUpdate(Progress..): 当在后台调用了publishProgress(Progress..)方法后,在这个方法中就可以对UI进行操作。
4. onPostExecute(Result).当后台任务执行完毕并通过return 进行返回时,返回的数据会作为参数传递到该方法中,可以利用该参数进行一些UI操作,例如关闭掉进度条等。

3.5服务

定义一个服务

 public class MyService extends Service{
@Override
public IBinder onBind(Intent intent){
return null;
}
}

如需要在服务中去处理一些事情则需要重写Service的另外一些方法
onCreate(),onStartCommand(),onDestroy().
使用Intent来启动和停止服务。

活动和服务进行通信
新建一个类让他继承Binder,然后在类的内部提供相应的方法,在Service创建该类的实例并且在onBind()方法中返回这个类的实例。然后在活动中就可以调用该类所提供的方法。

服务的生命周期:分两种,一种启动服务,一种绑定服务。但相互有影响。
服务的生命周期

服务的更多使用技巧
1. 防止服务因为内存问题等被回收掉可以使用前台服务。
2.如果直接在服务中执行一些耗时操作,很容易出现ANR(appliacation not responding)因此要使用服务的多线程编程技术,但防止程序员忘开线程或者忘记销毁,可以使用IntentService。
3. IntentSevice: 新建一个MyIntentService继承IntentService类,然后提供一个无参的构造函数,在内部调用父类的有参构造函数,实现onHandleIntent(),这个抽象方法,这个方法就是在子进程中运行,并且执行完后自动停止,重新onDestroy()方法。

3.6网络

Android发送Http请求方式:
1. HttpURLConnection
2. HttpClient

数据格式:
1. XML:可扩展标记语言
2. JSON:数据交换格式
3. XML与JSON的对比
两者都是文本表示的数据格式,可以跨平台、跨系统交换数据。XML适合标记文档,但是JSON是数据交互的理想格式。
两者最大的不同在于,XML是一个完整的标记语言,而JSON不是。XML利用标记语言的特性提供了绝佳的延展性(如XPath),在数据存储,扩展及高级检索方面优势明显,而JSON则由于比XML更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。
就可读性而言,两者都具备很好的可读性,但XML文档的可读性更高。
就数据表示和传输性能而言,JSON明显比XML简洁,格式简单,占用带宽少。

LBS

获取自己的经纬度:在onCreate()方法获取LocationManager的实例,然后是哟个getPrvovider()获取位置提供器,使用getLastKnowLocation()方法获取到当前记录位置细腻使用showlocation即可。
反向地理编码:GeoCoder和GeoCoding API不过需要连接网络,我们选择的是不连网的GeoCoding
百度地图API。

传感器

获取SensorManager的实例,然后指定传感器的类型,使用SensorEventListener进行监听。

发送短信

smsManager

播放音频

mediaPlayer

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值