Android面试简集(Service)

一·Service的启动方式
1.通过startService()方法启动
使用startService()调用的时候,不管这个方法被调用几次,onCreate()方法只执行一次,onStartCommand()方法被调用的次数和startService()一样,只有在调用了stopService()的时候,onDestory()才会被调用去销毁service。
在使用startService()的时候,是需要intent来传值,所以要在onStartCommand()方法中判断intent是否为null
2.通过bindService()方法启动
这种方式可以是service在activity中的操作更加的方便。例如activity要调用service中的某些方法,只需要在activity中获取ServiceConnction对象,通过这个对象去拿到service中的内部类的类对象,通过这个对象去调用service中的方法。被调用的这个类需要继承Binder。
使用bindService()方式启动的service在注销的时候一定要先解绑,即调用onUnbind()方法,否则无论怎么调用onDestory()都是没有用的。


service声明周期.png

启动服务的优先级比绑定服务高(绑定服务依托于activity)
服务在其托管进程的主线程中运行(UI线程)
二·Service与线程(Thread)的区别
1.Thread是程序执行的最小单位。
2.Thread的生命周期
新建 new Thread
就绪 Ready
运行 Run
死亡 Killed/Died
阻塞 Block
线程的致命缺点是:线程是不可控的,是无法控制的。比如,在activity中有一个线程,在Activity被关闭以后,如果没有主动停止线程的run()方法,那这个线程就会一直执行下去。activity被finish以后,将不再持有该线程的引用,就无法对Thread进行控制
3.Service是Android的一种机制,服务运行在主线程上;Service和应用程序运行在一个进程中。Service中不可以做耗时操作,否则,系统会报ANR(Application Not Responding)
三·IntentService
IntentService是继承并处理异步请求的一个类
在它内部有个工作线程HandlerThread来处理耗时操作
IntentService的启动和Service一样,都调用startService(),但是IntentService在停止的时候不需要做任何处理,且IntentService可多次调用,每一次的耗时操作都会以工作对列的形式在IntentService的一个回调方法中执行,每次只执行一个工作线程。


IntentService

onHandlerIntent是使用IntentService时,唯一需要实现的方法
IntentService的创建和开始方法

IntentService内部是通过消息的方式发送给HandlerThread的,然后有Handler中的Looper来处理消息,它的后台任务是顺序的,按调用的次序一次执行

你可能感兴趣的:(Android面试简集(Service))