关于Android Service的一些补充

原创 2012年03月28日 17:10:44

继续研究Android的官方文档又有新的发现,现记录如下:

        在默认的情况下,Android Service提供了一个可以在后台运行服务,那么这个在后台运行的Service其实是运行在主线程(UI 线程)里的。

         google官网对Service的解释如下:

         

Thus a Service itself is actually very simple, providing two main features:

  • A facility for the application to tell the system about something it wants to be doing in the background (even when the user is not directly interacting with the application). This corresponds to calls to Context.startService(), which ask the system to schedule work for the service, to be run until the service or someone else explicitly stop it.
  • A facility for an application to expose some of its functionality to other applications. This corresponds to calls to Context.bindService(), which allows a long-standing connection to be made to the service in order to interact with it.
           到这里我想反复强调一句话,不要指望Service会在一个单独的线程里实例化,这个服务的回调(onCreate onDestroy)仍然会在主线程里进行。

        

----------------------------------------------------------------------------------------------------------------------------------------------------------

这里我要反省自己之前犯的一个错误,希望大家不要犯同样的错误

           之前在CMMB的维护工作中,发现CMMB在启动/退出的时候会开启/停掉自己的相关服务MBBMSService,但是服务的退出比较耗时,会有一定的概率产生ANR。

       当时我是这样处理这个问题的,CMMB 应用要停服务的时候会调用stopService当时我把stopService的调用放到了一个单独线程中去做。我本来以为这样停止MBBMSService的操作会在一个单独的线程中做。结果仍然有ANR,原来我这么做并不能保证MBBMSService退出操作在一个独立线程做。因为调用stopService停止相应服务的时候,会回调MBBMSService中的onDestroy。在这个onDestroy在做具体的服务注销操作(耗时),但是这个onDestroy回调仍然在主线程中做,所以无法避免anr。对于这样的问题,应该在MBBMSService中将具体的耗时操作提出来,放到线程中做。但是这样可能会带来一些同步的问题,所以大家要慢慢Debug咯。


OK言归正传,如何让service运行在一个新的process中呢?原来我们在AndroidManifest.xml文件中:

<service android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:icon="drawable resource"
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>
在android:process域中指定这个service所运行的进程名,以下是官网的解释。


android:process
The name of the process where the service is to run. Normally, all components of an application run in the default process created for the application. It has the same name as the application package. The <application> element's process attribute can set a different default for all components. But component can override the defaultwith its own process attribute, allowing you to spread your application across multiple processes.

If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process.If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so.This allows components in different applications to share a process, reducing resource usage.

这样一个运行与单独进程中Service就启动了,既然这个Service运行与单独的进程中,那么和这个Service的交互过程就要使用IPC机制了。



关于IPC在应用层的实现方式,我还要继续学习下.......





Android数据存储(三)File 数据外部存储

三  File 数据外部存储 每一个android设备支持一个共享“外部存储”,您可以使用它来保存文件。这可能是一个移动存储媒体(如一个SD卡)或一个内部(固定的)存储。文件保存到外部存储是公开...
  • LonelyRoamer
  • LonelyRoamer
  • 2012年08月26日 00:24
  • 16473

oracle学习笔记 buffer_cache内存组织结构剖析

oracle学习笔记  buffer_cache内存组织结构剖析 这节课讲buffercache内存组织结构 讲到的概念有: CBC LRU LRU里面又分LRU、MRU LRUW CHECKPOIN...
  • xinzhan0
  • xinzhan0
  • 2016年09月25日 17:15
  • 536

关于android Service服务的一些简单应用

Service在android开发中占据着很大的重要性,因为我们Activity和广播自身的局限性,不能再他们里面进行网络请求,数据请求等耗时耗费资源的操作。所以,这个时候我们就需要用到Service...
  • lobiner
  • lobiner
  • 2016年11月22日 11:36
  • 104

关于Android service的一些基础知识集合

1.什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service? 在Service的生命周期中,被回调的方法比Activity少一些,只有onCre...
  • JJMM2009
  • JJMM2009
  • 2015年11月30日 16:58
  • 815

关于android service

1. 注意startService,bindService 差异(主进程退出,service的进程的独立性,能否remote?) 2.service 线程运行也可能影响前端UI,什么样的线程方式可以...
  • linuxchen
  • linuxchen
  • 2013年10月08日 02:07
  • 600

关于android的service问题

以前一直以为service是一个后台程序,其实不是,service只是一个没有界面的activity而已,耗时的操作如果放在onstart里面一样会抛出 ANR(没有响应)错误,并且如果想要一直在后...
  • samguoyi
  • samguoyi
  • 2013年02月27日 17:39
  • 422

关于Service,你要知道的一些知识

Service到底是什么? 服务,它是在后台运行一些耗时的任务同时不与用户交互或用于其他应用程序使用,比如下载,更新天气等等。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运...
  • qq_36935704
  • qq_36935704
  • 2017年05月31日 18:54
  • 119

Window 2003 Server R2安装IIS时总提示“需要Service Pack 2 CD-Rom 上的文件”

因为当初安装系统的时候没打算使用IIS功能,安装版本为Windows 2003 Server R2 SP2,后来需要再安装IIS组件的时候就弹出窗口要Service Pack 2 CD-Rom 上的文...
  • itdesk
  • itdesk
  • 2011年07月17日 11:57
  • 23605

Android之service一些基础回顾

今天是开始记录学习的第二天,今天记录的东西大部分是以前学过的,今天在这里把它梳理成文,主要还是对以前学习的一个总结和回顾。知识除了积累还要经常温故,古语有云:温故而知新。 1.Service的启动一般...
  • liuhaomatou
  • liuhaomatou
  • 2014年03月18日 23:50
  • 3457

android studio的安装和java环境变量的配置

文章前面先分享 android studio和JDK的下载地址 JDK: http://yunpan.cn/cJ9fdF59Y7Jt5  访问密码 7901 android studio:  http...
  • u011467384
  • u011467384
  • 2015年03月04日 10:23
  • 1255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Android Service的一些补充
举报原因:
原因补充:

(最多只允许输入30个字)