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 类的一个成员函数:
view plain
1. package ;
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(""));
17. } else {
18. (LOG_TAG, "Memory Service has started.");
19. }
20.
21. ......
22.
23. (LOG_TAG, "Client Activity Created.");
24. }
25.
26. ......
27. }
这里的“”是在程序配置文件 配
置的 Service 的名字,用来告诉 Android 系统它所要启动的服务的名字:
view plain
1. <manifest xmlns:android="http://schemas./apk/res/android"
2. package=""
3. android:sharedUserId=""
4. android:versionCode="1"
5. android:versionName="">
6. <application android:icon="***@drawable/icon" android:label="***@string/ap
p_name">
7. ......
8. <service
9. android:enabled="true"
10. android:name=".Server"
11. android:process=".Server" >
12. <intent-filter>
13. <action android:name=""/>
14. <category android:name="
ULT"/>
15. </intent-filter>
16. </service>
17. </app
Android系统在新进程中启动自定义服务过程(startService)的原理分析 来自淘豆网www.taodocs.com转载请标明出处.