Android面试题之Service

2022-09-03 11:19:40 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

1.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秒。 2.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添加到队列中 3.什么是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的话会抛异常。

插:Serializable和Parcelable的区别

在使用内存的时候,Parcelable类比Serialable性能高,所以推荐使用Parcelable类

1.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC 2.Parcelable不能使用在要将数据存储在磁盘上的情况。尽管Serializable效率低点,但在这种情况下,还是建 议使用Serializable。 3.Parcelable的实现,需要在类中添加一个静态成员变量,这个变量需要继承Parcelable.Creator接口。

更多面试题:Android面试题之Activity

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143448.html原文链接:https://javaforall.cn

0 人点赞