- Service
服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。Service是在main Thread中执行,Service中不能执行耗时操作(网络请求,拷贝数据库,大文件)。
可以在xml中设置Service所在的进程,让Service在另外的进程中执行。
Service执行的操作最多是20s,BroadcastReceiver是10s,Activity是5s。
Activity通过bindService(Intent,ServiceConnection,flag)与Service绑定。
Activity可以通过startService和bindService启动Service。
- IntentService
IntentService是一个抽象类,继承自Service,内部存在一个ServiceHandler(Handler)和HandlerThread(Thread)。IntentService是处理异步请求的一个类,在IntentService中有一个工作线程(HandlerThread)来处理耗时操作,启动IntentService的方式和普通的一样,不过当执行完任务之后,IntentService会自动停止。另外可以多次启动IntentService,每一个耗时操作都会以工作队列的形式在IntentService的onHandleIntent回调中执行,并且每次执行一个工作线程。IntentService的本质是:封装了一个HandlerThread和Handler的异步框架
- 跨进程通信
Intent,比如拨打电话
ContentProvider数据库存储数据
Broadcast广播通信
File 文件
Socket
Pipe管道
AIDL通信,通过接口共享数据:AIDL是Android IPC机制中很重要的一部分,AIDL主要是通过Binder来实现进程通信的
什么时候使用AIDL:
所以使用AIDL只有在你先允许来自不同应用的客户端跨进程通信访问你的Service,并且想要在你的Service处理多线程的时候才是必要的。简单的来说,就是多个客户端,多个线程并发的情况下要使用AIDL。
AIDL 就是定义一个接口,客户端(调用端)通过 bindService 来与远程服务端建立一个连接,在该连接建立时会将返回一个 IBinder 对象,该对象是服务端 Binder 的 BinderProxy。在建立连接时,客户端通过 asInterface 函数将该 BinderProxy 对象包装成本地的 Proxy,并赋值给Proxy类的 mRemote 字段,本地通过 mRemote 即可调用远程方法。
Binder是什么?
- wait和sleep的区别
wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sleep 是Thread的方法,sleep 是使线程睡眠,让出cpu,结束后自动继续执行
- Service生命周期
startService:
onCreate()-> onStartCommand()-> onDestroy()
bindService:
onCreate()-> onBind()-> onUnBind()->onDestroy()
- 简单介绍contentprovider
ContentProvider(内容提供者)是 Android 的四大组件之一,管理 Android 以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用。Android 为常见的一些数据提供了默认的 ContentProvider(包括音频、视频、图片和通讯录等),要实现与其他的 ContentProvider 通信首先要查找到对应的 ContentProvider 进行匹配。Android 中 ContenProvider 借助 ContentResolver 通过 Uri 与其他的 ContentProvider 进行匹配通信。其它应用可以通过 ContentResolver 来访问 ContentProvider 提供的数据,而 ContentResolver 通过 uri 来定位自己要访问的数据。
Uri:统一资源定位符,每一个 ContentProvider 都拥有一个公共的 URI,用于表示 ContentProvider 所提供的数据。// 示例
content://com.wang.provider.myprovider/tablename/id:
MIME:是指定某个扩展名的文件用一种应用程序来打开,就像你用浏览器查看 PDF 格式的文件,浏览器会选择合适的应用来打开一样。Android 中的工作方式跟 HTTP 类似,ContentProvider 会根据 URI 来返回 MIME 类型,ContentProvider 会返回一个包含两部分的字符串。MIME 类型一般包含两部分,如:
text/html
text/css
text/xml
application/pdf
Uri 代表要操作的数据,在开发过程中对数据进行获取时需要解析 Uri,Android 提供了两个用于操作 Uri 的工具类,分别为 UriMatcher 和 ContentUris 。
UriMatcher 类用于匹配 Uri。
ContentUris 类用于操作 Uri 路径后面的 ID 部分,它有两个比较实用的方法:withAppendedId(Uri uri, long id) 和 parseId(Uri uri)。
- 线程和进程的区别
进程:是系统进行资源分配的独立单元。
进程是程序的一次执行过程。若程序执行两次甚至多次,则需要两个甚至多个进程。
进程是正在运行程序的抽象。它代表运行的CPU,也称进程是对CPU的抽象。系统资源(如内存、文件)以进程为单位分配。
操作系统为每个进程分配了独立的地址空间
线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
与线程的区别是:
定义方面:进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径。(进程可以创建多个线程)
角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是CPU调度的单位。
资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
开销方面。进程切换的开销较大。线程相对较小。
- 序列化
序列化的目的:
(1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中
(2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)
(3).将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)
(4).Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
(5).序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
(6).在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.
- mvc 、 mvp 、mvvm 的区别
Mvc:View层一般由XML布局文件充当,在Model层中我们会进行一些数据处理的工作,比如网络数据请求、数据库操作等。Controller层通常由Activity、Fragment充当,并在其中进行界面、数据相关的业务处理。核心的业务逻辑都写在Controller中,导致Controller中的代码略显臃肿。
Mvp:Model层同样提供数据操作的功能,但View层的职责由Activity、Fragment、或某个View控件担任,最后Presenter层作为View层和Model层沟通的中介。通常在View层中,有一个Presenter成员变量,同时我们的View(可以是Activity、Fragment)需要实现一个接口,这样可以将View层中需要的业务逻辑操作通过该接口转交给Presenter来实现,进而Presenter通过Model得到相应的数据,并通过View层实现的接口返回到View中。这样View层和Model层的耦合就解除了,同时也将业务逻辑从View中抽离出来,转移到Presenter中,避免了Activity或Fragment过度臃肿,充斥大量业务逻辑代码。
Mvvm:在MVVM中,View层和Model层进行了双向绑定(即Data Binding),所以Model数据的更改会表现在View上,反之亦然。ViewModel就是用来根据具体情况处理View或Model的变化。
- compiledSdk、minimunSdk、targetSdk
minimunSdk:app能够运行的最小版本
compiledSdk:当前编译程序的sdk版本
targetSdk:targetSdkVersion是android向前兼容的主要方式,在Android4.4之后的设备上,系统会判断你的targetSdkVersion是否小于19,如果小于的话,那就按照19之前的api方法,如果大于等于19,那么就按照之后的api方法来走,保证了程序运行的一致性。也就是向前兼容性。
- 屏幕适配方案