Android系统在新进程中启动自定义服务过程(sta(7)

Step 17. ActivityThread.handleCreateService

这个函数定义在frameworks/base/core/java/Android/app/ActivityThread.java文件中:

 

public final class ActivityThread {              ......          private final void handleCreateService(CreateServiceData data) {           // If we are getting ready to gc after going to the background, well            // we are back active so skip it.            unscheduleGcIdler();              LoadedApk packageInfo = getPackageInfoNoCheck(               data.info.applicationInfo);           Service service = null;           try {               java.lang.ClassLoader cl = packageInfo.getClassLoader();               service = (Service) cl.loadClass(data.info.name).newInstance();           } catch (Exception e) {               if (!mInstrumentation.onException(service, e)) {                   throw new RuntimeException(                       "Unable to instantiate service " + data.info.name                       + ": " + e.toString(), e);               }           }              try {               if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);                  ContextImpl context = new ContextImpl();               context.init(packageInfo, nullthis);                  Application app = packageInfo.makeApplication(false, mInstrumentation);               context.setOuterContext(service);               service.attach(context, this, data.info.name, data.token, app,                   ActivityManagerNative.getDefault());               service.onCreate();               mServices.put(data.token, service);               try {                   ActivityManagerNative.getDefault().serviceDoneExecuting(                       data.token, 000);               } catch (RemoteException e) {                   // nothing to do.                }                          } catch (Exception e) {               if (!mInstrumentation.onException(service, e)) {                   throw new RuntimeException(                       "Unable to create service " + data.info.name                       + ": " + e.toString(), e);               }           }       }          ......      }  

        这里的data.info.name就是自定义的服务类shy.luo.ashmem.Server了。

Step 18. ClassLoader.loadClass

这一步实现在上面的ActivityThread.handleCreateService函数中:

 

java.lang.ClassLoader cl = packageInfo.getClassLoader();   service = (Service) cl.loadClass(data.info.name).newInstance();  

        Step 19. Obtain Service

这一步也是实现在上面的ActivityThread.handleCreateService函数中。上面通过ClassLoader.loadClass来导入自定义的服务类shy.luo.ashmem.Server并且创建它的一个实例后,就通过强制类型转换得到一个Service类实例。前面我们说过,自己的服务类必须要继承于Service类,这里就体现出来了为什么要这样做了。

Step 20. Service.onCreate

这一步继续实现在上面的ActivityThread.handleCreateService函数中:

 

service.onCreate();  

        因为这里的service实际上是一个shy.luo.ashmem.Server类实例,因此,这里就是执行shy.luo.ashmem.Server类的onCreate函数了:

 

public class Server extends Service {              ......          @Override       public void onCreate() {           ......          }          ......   }  

        至此,这个自定义的服务就启动起来了。

这样,Android系统在新进程中启动服务的过程就分析完成了,虽然很复杂,但是条理很清晰。它通过三次Binder进程间通信完成了服务的启动过程,分别是:

一. Step 1至Step 7,从主进程调用到ActivityManagerService进程中,完成新进程的创建;

二. Step 8至Step 11,从新进程调用到ActivityManagerService进程中,获取要在新进程启动的服务的相关信息;

三. Step 12至Step 20,从ActivityManagerService进程又回到新进程中,最终将服务启动起来。

学习完Android系统在新进程中启动服务的过程后,希望读者对Android系统的Service有一个深刻的理解。在编写Android应用程序的时候,尽量把一些计算型的逻辑以Service在形式来实现,使得这些耗时的计算能在一个独立的进程中进行,这样就能保持主进程流畅地响应界面事件,提高用户体验。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwddpy.html