【8】Service

2016-06-05  本文已影响0人  嗟嗟嗟

一、什么是Service?

Service是安卓的服务类,是一种没有界面的工具类,可以长时间在后台运行,用来执行一些不需要界面但需要在长时间执行的任务,比如:音乐播放和地图导航,网络下载等。

此章节没有太多代码好贴,去官方找了些概念性的东西。

二、Service的运行逻辑

服务可由其他应用组件启动,一般有两种形式:启动和绑定

startService(intent);
stopService(intent);
ServiceConnection conn = new ServiceConnection() {

        //服务连接时调用
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            service = ((MyBinderService.MyBinder)iBinder).getService();
        }

        //服务被异常中断时调用
        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
};
bindService(intent,conn, Service.BIND_AUTO_CREATE);
unbindService(conn);

服务可以同时以这两种方式运行,也就是说,它既可以是启动服务(以无限期运行),也允许绑定。问题只是在于您是否实现了一组回调方法:onStartCommand()(允许组件启动服务)和 onBind()(允许绑定服务)。

无论应用是处于启动状态还是绑定状态,抑或处于启动并且绑定状态,任何应用组件均可像使用活动那样通过调用 Intent 来使用服务(即使此服务来自另一应用)。 不过,您可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。 使用清单文件声明服务部分将对此做更详尽的阐述。

PS:服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。 这意味着,如果服务将执行任何 CPU 密集型工作或阻止性操作(例如 MP3 播放或联网),则应在服务内创建新线程来完成这项工作。通过使用单独的线程,可以降低发生“应用无响应”(ANR) 错误的风险,而应用的主线程仍可继续专注于运行用户与 Activity 之间的交互。

三、服务的生命周期

服务生命周期(从创建到销毁)可以遵循两条不同的路径:

这两条路径并非完全独立。也就是说,您可以绑定到已经使用 startService() 启动的服务。例如,可以通过使用 Intent(标识要播放的音乐)调用 startService() 来启动后台音乐服务。随后,可能在用户需要稍加控制播放器或获取有关当前播放歌曲的信息时,Activity 可以通过调用 bindService() 绑定到服务。在这种情况下,除非所有客户端均取消绑定,否则 stopService() 或 stopSelf() 不会真正停止服务。

官方生命周期图

service_lifecycle.png

通过实现这些方法,您可以监控服务生命周期的两个嵌套循环:

Ps:尽管启动服务是通过调用 stopSelf() 或 stopService() 来停止,但是该服务并无相应的回调(没有 onStop() 回调)。因此,除非服务绑定到客户端,否则在服务停止时,系统会将其销毁—onDestroy() 是接收到的唯一回调。

上一篇 下一篇

猜你喜欢

热点阅读