IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android面试问题收集 -> 正文阅读

[移动开发]Android面试问题收集

1.? 数据库的操作类型有哪些,如何导入外部数据库?

读懂题目。如果碰到问题比较模糊的时候可以适当问问面试官。

配合面试官来面试:面试是一个相互了解的过程,要充分利用面试的题目和时间把自己的能力和技术展现出来,面试官能够看到你的真实技术。

1)使用数据库的方式有哪些?

(1)openOrCreateDatabase(String path);

(2)继承SqliteOpenHelper类对数据库及其版本进行管理(onCreate,onUpgrade)

当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase();的时候才会打开数据库。如果当时没有数据库文件的时候,系统就会自动生成一个数据库。

2)操作的类型:增删改查CRUD

直接操作SQL语句:SQliteDatabase.execSQL(sql);

面向对象的操作方式:SQLiteDatabase.insert(table,nullColumnHack, ContentValues);

如何导入外部数据库?

一般外部数据库文件可能放在SD卡或者res/raw或者assets目录下面。

写一个DBManager的类来管理,数据库文件搬家,先把数据库文件复制到”/data/data/包名/databases/”目录下面,然后通过db.openOrCreateDatabase(db文件),打开数据库使用。

我上一个项目就是这么做的,由于app上架之前就有一些初始数据需要内置,也会碰到数据的升级等问题,我是这么做的…… 同时我碰到最有意思的问题就是关于数据库并发操作的问题,比如:多线程操作数据库的时候,我采取的是封装使用互斥锁来解决……

2.是否使用过本地广播,和全局广播有什么差别?

引入本地广播的机制是为了解决安全性的问题:

1)正在发送的广播不会脱离应用程序,比用担心app的数据泄露;

2)其他的程序无法发送到我的应用程序内部,不担心安全漏洞。(比如:如何做一个杀不死的服务---监听火的app 比如微信、友盟、极光的广播,来启动自己。)

3)发送本地广播比发送全局的广播高效。(全局广播要维护的广播集合表 效率更低。全局广播,意味着可以跨进程,就需要底层的支持。)

本地广播不能用静态注册。----静态注册:可以做到程序停止后还能监听。

使用:

(1)??注册

LocalBroadcastManager.getInstance(this).registerReceiver(newXXXBroadCastReceiver(), new IntentFilter(action));

(2)??取消注册:

LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver)

3.是否使用过IntentService,作用是什么, AIDL 解决了什么问题?

如果有一个任务,可以分成很多个子任务,需要按照顺序来完成,如果需要放到一个服务中完成,那么使用IntentService是最好的选择。

一般我们所使用的Service是运行在主线程当中的,所以在service里面编写耗时的操作代码,则会卡主线程会ANR。为了解决这样的问题,谷歌引入了IntentService.

IntentService的优点:

(1)??它创建一个独立的工作线程来处理所有一个一个intent。

(2)??创建了一个工作队列,来逐个发送intent给onHandleIntent()

(3)??不需要主动调用stopSelf()来结束服务,因为源码里面自己实现了自动关闭。

(4)??默认实现了onBind()返回的null。

(5)??默认实现的onStartCommand()的目的是将intent插入到工作队列。

总结:使用IntentService的好处有哪些。首先,省去了手动开线程的麻烦;第二,不用手动停止service;第三,由于设计了工作队列,可以启动多次---startService(),但是只有一个service实例和一个工作线程。一个一个熟悉怒执行。

4.AIDL解决了什么问题?

AIDL的全称:AndroidInterface Definition Language,安卓接口定义语言。

由于Android系统中的进程之间不能共享内存,所以需要提供一些机制在不同的进程之间进行数据通信。

远程过程调用:RPC—RemoteProcedure Call。? 安卓就是提供了一种IDL的解决方案来公开自己的服务接口。AIDL:可以理解为双方的一个协议合同。双方都要持有这份协议---文本协议 xxx.aidl文件(安卓内部编译的时候会将aidl协议翻译生成一个xxx.java文件---代理模式:Binder驱动有关的,Linux底层通讯有关的。)

在系统源码里面有大量用到aidl,比如系统服务。

电视机顶盒系统开发。你的服务要暴露给别的开发者来使用。

讲解Binder机制。

5.Activity、 Window、 View 三者的差别,fragment 的特点?

Activity、 Window、 View 三者如何协同显示界面的。---考点:显示的过程(view 绘制流程)源码的熟悉度。

Activity剪窗花的人(控制的);Window窗户(承载的一个模型);View窗花(要显示的视图View);LayoutInflater剪刀---将布局(图纸)剪成窗花。

(Alt+方向箭头)

6.fragment 的特点?(你用fragment有没有领略到一些乐趣,或者有没有踩过什么坑?)

fragment的设计主要是把Activity界面包括其逻辑打碎成很多个独立的模块,这样便于模块的重用和更灵活地组装呈现多样的界面。

1)Fragment可以作为Activity界面的一个部分组成;

2)可以在一个Activity里面出现多个Fragment,并且一个fragment可以在多个Activity中使用;

3)在Activity运行中,可以动态地添加、删除、替换Fragment。

4)Fragment有自己的生命周期的,可以响应输入事件。

踩过的坑:

1.重叠;

2. 注解newAPI(兼容包解决);

3. Setarguement()初始化数据;

4. 不能在onsave...()方法后,commit;?

5. 入栈出栈问题; --事务。像Activity跳转一样的效果,同时返回的时候还能回到之前的页面(fragment)并且状态都还在。replace(f1,f2)严重影响生命周期:add()+show+hide

8.ANR 定位和修正

可以通过查看/data/anr/traces.txt查看ANR信息。

根本原因是:主线程被卡了,导致应用在5秒时间未响应用户的输入事件。

很多种ANR错误出现的场景:

1)主线程当中执行IO/网络操作,容易阻塞。

2)主线程当中执行了耗时的计算。----自定义控件的时候onDraw方法里面经常这么做。

(同时聊一聊自定义控件的性能优化:在onDraw里面创建对象容易导致内存抖动---绘制动作会大量不断调用,产生大量垃圾对象导致GC很频繁就造成了内存抖动。)内存抖动就容易造成UI出现掉帧卡顿的问题

3)BroadCastReceiver没有在10秒内完成处理。

4)BroadCastReceiver的onReceived代码中也要尽量减少耗时的操作,建议使用IntentService处理。

5)Service执行了耗时的操作,因为service也是在主线程当中执行的,所以耗时操作应该在service里面开启子线程来做。

6)使用AsyncTask处理耗时的IO等操作。

7)使用Thread或者HandlerThread时,使用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)或者java.lang.Thread.setPriority (int priority)设置优先级为后台优先级,这样可以让其他的多线程并发消耗CPU的时间会减少,有利于主线程的处理。

8)Activity的onCreate和onResume回调中尽量耗时的操作。

336045866cb292573010427049a2ad55.png

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:08:59  更:2022-02-04 11:10:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:47:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码