总结问题-为什么更新慢
一个应用程序有几个Context?为什么Activity、Service、Application都继承自Context,Context的作用是什么呢?
https://zhuanlan.zhihu.com/p/141126600
先说类关系:
Activity继承自ContextThemeWrapper,而Application和Service继承自ContextWrapper,很显然ContextThemeWrapper在ContextWrapper的基础上又做了一些操作使得Activity变得更强大
Context数量=Activity数量+Service数量+1
应用程序全局信息接口,访问资源、类、以及启动活动广播接受intent
Android9月16日题:Java 中堆和栈有什么不同?
参考答案:
为什么把这个问题归类在多线程和并发面试题里?因为栈是一块和线程紧密相关的内存区域。每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时 volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值
Android9月21日题:数据库的四大特征,数据库的隔离级别?
参考答案:
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列, 这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银 行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要 么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的 单位,在每个事务结束时,都能保持数据一致性。
事务具有以下 4 个基本特征:数据库的四大特征:
(1)原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
(2)一致性(Consistency)
一个事务执行之前和执行之后都必须处于一致性状态。
(3)隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个 用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
(4)持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性 的。
数据库的隔离级别:
1)Serializable(串行化):可避免脏读、不可重复读、幻读的发生。
2)Repeatable read (可重复读):可避免脏读、不可重复读的发生。
3)Read committed (读已提交):可避免脏读的发生。
4)Read uncommitted (读未提交):最低级别,任何情况都无法保证。
每日一题:多进程场景遇见过么? Android9月27日题:多进程场景遇见过么?
参考答案:
- 在新的进程中,启动前台 Service,播放音乐。
- 一个成熟的应用一定是多 模块化的。首先多进程开发能为应用解决了 OOM 问题,因为 Android 对内存的 限制是针对于进程的,所以,当我们需要加载大图之类的操作,可以在新的进程 中去执行,避免主进程 OOM。而且假如图片浏览进程打开了一个过大的图片, java heap 申请内存失败,该进程崩溃并不影响我主进程的使用。
每日一题:服务启动一般有几种,服务和 activty 之间怎么通信,服务和服务之间怎么通信
参考答案:
1、startService:onCreate()--->onStartCommand() ---> onDestory() 如果服务已经开启,不会重复的执行 onCreate(), 而是会调用 onStartCommand()。一旦服务开启跟调用者(开启者)就没有任何关系了。开启 者退出了,开启者挂了,服务还在后台长期的运行。开启者不能调用服务里面 的方法。
2、bindService:onCreate() --->onBind()--->onunbind()--->onDestory() bind 的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。绑定者可 以调用服务里面的方法。
3、通信:
-
通过 Binder 对象。
-
通过 broadcast(广播)。
每日一题:Handler、Thread 和 HandlerThread 的差别
参考答案:
- Handler:在 android 中负责发送和处理消息,通过它可以实现其他支线线程 与主线程之间的消息通讯。
- Thread:Java 进程中执行运算的最小单位,亦即执行处理机调度的基本单位。某一进程中一路单独运行的程序。
- HandlerThread:一个继承自 Thread 的类 HandlerThread,Android 中没有 对 Java 中的 Thread 进行任何封装,而是提供了一个继承自 Thread 的类 HandlerThread 类,这个类对 Java 的 Thread 做了很多便利的封装。HandlerThread 继承于 Thread,所以它本质就是个 Thread。与普通 Thread 的差 别就在于,它在内部直接实现了 Looper 的实现,这是 Handler 消息机制必不可 少的。有了自己的 looper,可以让我们在自己的线程中分发和处理消息。如果 不用 HandlerThread 的话,需要手动去调用 Looper.prepare()和 Looper.loop() 这些方法。
Android10月15日题:Service生命周期
参考答案:
startService() --> onCreate() --> onStartCommand() --> Service running --> onDestory()
bindService() --> onCreate() --> onBind() --> Service running --> onUnbind() --> onDestory()
onCreate():
系统在Service第一次创建时执行此方法,来执行只运行一次的初始化工作,如果service已经运行,这个方法不会调用。
onStartCommand():
每次客户端调用startService()方法启动该Service都会回调该方法(多次调用),一旦这个方法执行,service就启动并且在后台长期运行,通过调用stopSelf()或stopService()来停止服务。
onBind():
当组件调用bindService()想要绑定到service时,系统调用此方法(一次调用),一旦绑定后,下次在调用bindService()不会回调该方法。在你的实现中,你必须提供一个返回一个IBinder来使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null
onUnbind():
当前组件调用unbindService(),想要解除与service的绑定时系统调用此方法(一次调用,一旦解除绑定后,下次再调用unbindService()会抛异常)
onDestory():
系统在service不在被使用并且要销毁的时候调用此方法(一次调用)。service应在此方法中释放资源,比如线程,已注册的监听器、接收器等等。
Android10月13日题:你知道Android消息机制模型吗?
参考答案:
消息机制主要包含:MessageQueue、Handler、Looper和Message这四大部分。
- Message:需要传递的消息,可以传递数据
- MessageQueue:消息队列,但是它的内部实现并不是用的队列,实际上是通过一个单链表的数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要功能是向消息池传递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next)
- Handler:消息辅助类,主要功能是向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage)
- Looper:不断循环执行(Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。
Android10月10日题:哪些情况下的对象会被垃圾回收机制处理掉?
参考答案:
- 所有实例都没有活动线程访问。
- 没有被其他任何实例访问的循环引用实例。
- Java 中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。
要判断怎样的对象是没用的对象。这里有 2 种方法:
- 采用标记计数的方法:给内存中的对象给打上标记,对象被引用一次,计数就加 1,引用被释放了,计数就减一,当这个计数为 0 的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:
- 采用根搜索算法:从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的