Android面试题之Service

Android面试题之Service1.service是否在mainthread中执行,service里面是否能执行耗时的操作?默认情况,如果没有service所运行的进程,Service和Activity是运行在当前app所在进程中的mainthread里面service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)特殊情况,可以在清单文件中配置service所在的进程,让service在另外的进程中执行。

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

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接口。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号