Welcome 微信登录

首页 / 操作系统 / Linux / Android系统在新进程中启动自定义服务过程(startService)的原理分析

在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验。Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务。在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的。在主进程调用startService函数时,会通过Binder进程间通信机制来通知ActivitManagerService来创建新进程,并且启动指定的服务。在Android系统中,Binder进程间通信机制使用非常广泛,因此,希望读者在继续阅读下面的内容之前,对Android系统和Binder进程间通信机制有一定的了解,具体可以参考前面Android进程间通信(IPC)机制Binder简要介绍和学习计划一文。关于startService的具体用法,可以参考前面Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划一文中用到的实例,它是Activity类的一个成员函数:
  1. package shy.luo.ashmem;  
  2.   
  3. ......  
  4.   
  5. public class Client extends Activity implements OnClickListener {  
  6.     ......  
  7.     IMemoryService memoryService = null;  
  8.     ......  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         ......  
  13.   
  14.         IMemoryService ms = getMemoryService();  
  15.         if(ms == null) {          
  16.             startService(new Intent("shy.luo.ashmem.server"));  
  17.         } else {  
  18.             Log.i(LOG_TAG, "Memory Service has started.");  
  19.         }  
  20.   
  21.         ......  
  22.   
  23.         Log.i(LOG_TAG, "Client Activity Created.");  
  24.     }  
  25.   
  26.     ......  
  27. }  
这里的“shy.luo.ashmem.server”是在程序配置文件AndroidManifest.xml配置的Service的名字,用来告诉Android系统它所要启动的服务的名字:
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="shy.luo.ashmem"  
  3.     android:sharedUserId="android.uid.system"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0">  
  6.         <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.             ......  
  8.             <service   
  9.                 android:enabled="true"   
  10.                 android:name=".Server"  
  11.                 android:process=".Server" >  
  12.                     <intent-filter>  
  13.                         <action android:name="shy.luo.ashmem.server"/>  
  14.                         <category android:name="android.intent.category.DEFAULT"/>  
  15.                     </intent-filter>  
  16.             </service>  
  17.         </application>  
  18. </manifest>