关于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 service 实现Binder类补充

绑定到一个Service   应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回...

Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充

开门见山 第一种 第二种 第三种 总结开门见山开启服务有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定。 具体的启动情况有下: ①调用startServic...

Android Service客户端测试例子

  • 2017年11月06日 14:12
  • 22.47MB
  • 下载

Android Service测试例子

  • 2017年11月06日 14:11
  • 24.21MB
  • 下载

Android中程序与Service交互的方式——交互方式

上一篇文章:Android中程序与Service交互的方式——综述 简述了Service的一些基础知识以及Service和Thread的简单区别,本文将着重讲解与Service交互的五种基本方式:广播...

Android中与Service交互的三种方式

  • 2016年05月11日 13:06
  • 2.1MB
  • 下载

android push notification service Demo

  • 2014年12月30日 11:11
  • 83KB
  • 下载

第87章、系统服务之WIFI_SERVICE(从零开始学Android)

WIFI就是一种无线联网技术,常见的是使用无线路由器。那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点...

android.service.java

  • 2013年11月27日 15:35
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Android Service的一些补充
举报原因:
原因补充:

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