Android 面试题--Service 1、Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作? <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> 2、Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的Service? 3、请描述一下 Service 的生命周期 service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service:被开启的service通过其他组件调用 startService()被创建。这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。 A bound service:被绑定的service是当其他组件(一个客户)调用bindService()来创建的。客户可以通过一个IBinder接口和service进行通信。 客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。 这两条路径并不是完全分开的。即是说,你可以和一个已经调用了 startService()而被开启的service进行绑定。 比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。 Service 的生命周期图如下所示,帮助记忆 4、什么是 IntentService?有何优点? 我们通常只会使用 Service,可能 IntentService 对大部分同学来说都是第一次听说。那么看了下面的介绍相信你就不再陌生了。 如果你还是不了解那么在面试的时候你就坦诚说没用过或者不了解等。并不是所有的问题都需要回答上来的。 一、IntentService 简介 IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。先看 Service 本身存在两个问题: 二、IntentService 特征 会创建独立的 worker 线程来处理所有的 Intent 请求; 他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是 Android 四大组件之一。他俩都是 Context 类的子类 ContextWrapper 的子类,因此他俩可以算是兄弟关系吧。不过兄弟俩各有各自的本领, Activity 负责用户界面的显示和交互, Service 负责后台任务的处理。 Activity和 Service 之间可以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。 6、Service 和 Activity 在同一个线程吗 对于同一 app 来说默认情况下是在同一个线程中的,main Thread (UI Thread)。 7、Service 里面可以弹吐司么 可以的。弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。比如我们在 Service 中完成下载任务后可以弹一个吐司通知用户。 8、什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有什么区别,怎样停用 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 的话会抛出异常。 9、在 service 的生命周期方法 onstartConmand()可不可以执行网络操作?如何在 service 中执行网络操作? 可以直接在 Service 中执行网络操作,在 onStartCommand()方法中可以执行网络操作 |