关于Service的一些问题
一般来说,service已经总所周知了,但还是经常的看看,有助于对服务的更深的理解,每天复习,多学习一点对自己也是有很大的帮助
- Service的生命周期
- 面试时经常问到的关于Service的问题
- Service常用的分类
- 常用的生命周期的分类
Service的生命周期
Service的生命周期,因为比Activity的回调少一些,So:
- onCreat
- onStart
- onDestory
- onBind
- onUnbind
生命周期常用的方法
一.手动调用:
- StartService
- StopService
- bindService
- unBindService
二.内部自动调用:
- onCreat
- onstartCommand(开始服务)
- onDestory(销毁服务)
- onBind(绑定服务)
- onUnBind(解绑)
private static final String TAG = "ContactService";
private MyBinder mBinder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
}
/**
* 用于和Activity建立关联的
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload() executed");
// 执行具体的下载任务
}
}
常用的生命周期的使用
- 只使用startService启动
- 只使用BindService启动
- 同时使用StartService启动和BindService绑定
Service的分类
按照运行地点分类
- 本地服务(需要依附于某个进程的服务 Eg:音乐)
- 远程服务(系统级别的服务)
按照运行类型分类
- 前台服务(服务使用时需要让用户知道且操作 Eg:音乐)
- 后台服务(不需要让用户知道 Eg:天气更新,Date同步)
按照功能类型
- 可通信服务
1.启动在后台长期运行的服务,需要与Activity && Service进行通信,需要控制服务的开始时刻
⑴使用BindService启动
⑵第一次BindService时才会创建服务的实例并运行它,可以节约很多系统资源,特别是当服务是Remote Service时,会更明显。
⑶服务是公开一个接口,供客户端(Android||IOS远程调用)执行方法
⑷BroadcastReceiver也可以完成需求,But:如果交互的很频繁,容易造成性能问题,而且本身执行代码的时间非常短可能执行到一半,后面的代码便不会执行
2.启动在后台长期运行的服务需要Activity&&Service通信,不需要控制服务开始,启动便开始运行
⑴使用BindService与StartService启动
面试时经常问到的关于Service的问题
- service是否在main thread中执行,service里面是否能执行耗时的操作?
默认情况,如果没有service所运行的进程,Service和Activity是运行在当前app所在进程中的main thread里面
service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)
特殊情况,可以在清单文件中配置service所在的进程,让service在另外的进程中执行。
<service
android:name=""
android:enabled="true"
android:process=":remote"
</service>
在Service中执行的耗时操作最多20秒,BroadcastReceiver是10秒,Activity是5秒。
- Activity怎么和Service绑定,怎么在Activity中启动自己对应的Service?
Activity通过bindService(Intent service,ServiceConnection conn,int flags)跟Service进行绑定,当绑定成
功的时候ServiceService会将代理对象通过会调的方式传给conn,这样我们就拿到了Service提供的服务代理对象。
在Activity中可以通过startService和bindService方法启动Service。一般情况下如果想获取Service的服务对象
那么肯定需要bindService()方法,比如音乐播放器,第三方支付等。如果仅仅只是为了开启一个后台任务那么可
以使用startService()方法。
- IntentService简介
IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在的两个问题:
(1)Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中。
(2)Service也不是专门一条新的进程,因此不应该在Service中直接处理耗时的任务
- IntentService特征
会创建独立的worker线程来处理所有的Intent请求
会创建独立的worker线程来处理OnHandlerIntent()方法实现的代码,无需处理多线程的问题
所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
为Service的onBind()提供默认实现,返回null
为Service的onStartCommand提供默认实现,将请求Intent添加到队列中
- 什么是Service以及描述下他的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?
在Service的生命周期中,被回调的方法比Activity少一些只有onCreate(),onStart(),onDestroy(),onBind(),onUnbind()
通常有两种方式启动一个Service,它们对生命周期的影响是不太一样的。
(1)通过startService
Service会经历onCreate(),onStart(),然后处于运行状态,stopService()时候调用onDestroy方法
如果是调用者自己直接退出而没有调用stopService的haunted,Service会一直在后台运行
(2)通过bindService
Service会运行onCreate,然后调用onBind(),这时候调用者和Service绑定在一起。调用者退出了,Service就会调
用onUnbind->onDestroy方法
需要注意的是如果几个方法交织在一起
*一个原则是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只会调用一次onDestroy方法。
*如果一个Service通过bindService被start之后,多次调用bindService的话,Service只会调用一次onBind方法
多次调用unBindService的话会抛异常。
面试题永远会更新,别总是去记忆,看遍天下码片,心中自然无码
Finally
多学习,多进步,每天进步一点
- Welcome to the Android exchange group. Daniel is waiting for you 221348869(二群) 454430053(一群)