这是延续上一部分的知识,依然是面试题,进入正题:android
面试题一:谈谈你对Activity的理解:面试
这是考官但愿你把本身的心得,作项目的时候的体会写出来;咱们能够答Activity异常被系统回收的时候怎么处理的,而后能够讲讲Activity的生命周期。json
面试题二:Service是否运行在主线程?可否在Service里面执行耗时的操做?app
答:service是默认运行在主线程的,不少人以为是后台服务就以为应该是在子线程,其实不是,因此咱们不能在里面执行耗时的操做,由于会产生ANR异常。咱们要作耗时的操做要新开一个线程,处理耗时操做。异步
固然咱们也能够指定service在指定线程中执行,通常咱们在配置清单文件的时候指定所在的线程:this
面试题三:两个Activity之间怎么传递数据?操作系统
答:若是是基本的数据类型,咱们能够经过Intent 传递数据,也能够经过intent putExtra传递一个bundle过来,其余的intent想要获取数据,能够经过:线程
Bundle 相似map的集合对象
可是若是是复杂类型的话,咱们能够在Application 全局里面存放 对象 ,本身去实现本身的application的这个类,基础系统的application ,每一个activity均可以取到 ,固然记得 清单文件里面配置一下。接口
实现复杂类型的传递还能够经过让一个对象实现Serializable接口,实现了在各个接口后就能够序列化到文件,具体实现过程是实例化一个FileOutputStream和一个ObjectOutputStream,而后经过对象输出流向文件写数据。咱们在另一个Activity经过对象 读取这个对象数据,这样就能实现了:
以上经过Serializable把对象序列化到文件而后读取效率不高,入门若是是序列化到内存效率就高了,Google因而提供了parcelable接口,Parcelable 把对象序列化到android操做系统 的一块公用的内存空间。
其实传递对象咱们还能够用Gson,相似于json把对象按照必定格式打包成字符串,而后经过intent传递基本数据类型同样再反序列化拿到数据:
而后咱们拿到这个str字符串,取单个对象:
取对象集合:
可是若是咱们要传递一个大文件的时候就不能用上面的方法了,由于效率过低,咱们就会传递一个引用过去,经过uri:
面试题四:怎么在启动一个Activity的时候启动一个service?
咱们在OnCreate方法里面new Intent(要启动的service);而后startService(intent);。
面试题五:同一个程序,但不一样的Activity是否能够放在不一样的Task任务栈中?
这是能够的,咱们能够在激活一个新的activity时候, 给intent设置flag:
Intent的flag添加FLAG_ACTIVITY_NEW_TASK singleinstance 单独的任务栈
,而后这个新开的Activity栈就会在单独的task栈里面。
当咱们在开启的时候就已经设置了开启新的任务栈,拿咱们在Activity的onCreate方法里面,即便还写了开启一个新任务栈,也不会重复开启。
面试题五:Activity怎么和Service绑定,怎么在activity中启动本身对应的service?
咱们在Service的不一样方法里面写服务,效果不同的。
StartService()里面的话,一旦被建立 调用着无关 无法使用service里面的方法。
bindService () 把service 与调用者绑定 ,若是调用者被销毁, service会销毁。同时咱们也可使用里面的方法,经过复写里面的bandService启动服务:咱们须要写一个本身的ServiceConnection对象MyConn,(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.:
面试题六:什么是service,service的生命周期?怎么启动一个service,这些方法有啥区别,怎么停用service?
在Service的生命周期中,由于没有界面,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,方法,由于是服务,因此有onBind和onUnbind方法。
一般有两种方式启动一个Service,他们对Service生命周期的影响是不同的。
1.经过startService
前面讲过,StartService,没有和调用者绑定在一块儿,Service会经历 onCreate 到onStart,而后处于运行状态,stopService的时候调用onDestroy方法。
若是是调用者本身直接退出而没有调用stopService的话,Service会一直在后台运行。
2.经过bindService
这种方法是和调用者绑定在一块儿的,Service会运行onCreate,而后是调用onBind,调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。所谓绑定在一块儿就共存亡了。调用者也能够经过调用unbindService方法来中止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。
可是几个方法交织在一块儿的话,会出现什么状况呢?
一个原则是Service的onCreate的方法只会被调用一次,就是你不管多少次的startService又bindService,Service只被建立一次。
若是先是bind了,那么start的时候就直接运行Service的onStart方法,若是先是start,那么bind的时候就直接运行onBind方法。
若是service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁
若是一个service经过startService 被start以后,屡次调用startService 的话,service会屡次调用onStart方法。屡次调用stopService的话,service只会调用一次onDestroyed方法。
若是一个service经过bindService被start以后,屡次调用bindService的话,service只会调用一次onBind方法。
屡次调用unbindService的话会抛出异常。
面试题七:不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
这个问题问得不太好,其实默认不作任何处理,B里面的音乐都能播放.
遇到问题, 能够随机应变,灵活发挥,多考虑些细节,好比说这个题就能够这样说,说说你对startActivityForResult的理解()
A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.
面试题八:什么是IntentService?有何优势?
简单来说相对于通常service他本身开了一个thread,咱们在OnHandleIntent()里面处理耗时的操做。它是Sdk给咱们提供的方便的,带有异步处理的service类,异步处理的方法 OnHandleIntent()。每次执行OnHandleIntent方法,都回开启一个不一样的线程。
面试题九:何时使用Service?
前台进程优先级最高,最难被杀死,service只比前台进程优先级第一点,用service能让咱们在后台运行的进程不容易挂掉。
1. 若是service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程至关于前台进程以免被killed。
2. 若是当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,可是比那些不可见的进程更重要,这就意味着service通常不会被killed.
3.若是一个前台进程同时又绑定到了service上,那这个进程优先级最高。能够理解为,service是可见的。
4. 若是service可使用startForeground(true)方法来将service设置为前台状态,至关于强行提升了这个service的优先级,那么系统就认为是对用户可见的,并不会在内存不足时killed。
那service用在哪里呢?
1.Service的特色可让他在后台一直运行,能够在service里面建立线程去完成耗时的操做. 天气预报 widget TimerTask Timer 按期执行timertask。
2.Broadcast receiver捕获到一个事件以后,能够起一个service来完成一个耗时的操做. Broadcast receiver生命周期 和 响应时间很短,只有10秒,没执行完的话就没有执行了。