为 Android 添加 Java 层服务
也就是添加自定义的aidl服务到serviceManager
通过ServiceManager.getService取得服务
同前一篇文章类似,此文旨在简单介绍一下如何在 java层添加自己的服务,相关的理论网上已经有很多文章,在此不在详述。
Java层服务顾名思义即为从 Java层提供的服务,它与 C++层的服务不同之处在于其服务进程的运行由系统( ServiceManager)统一维护。在文件 frameworks /base /services /java /com /android /server /SystemServer.java 中我们可以看到以下代码:
AlarmManagerService alarm = new AlarmManagerService (context );
ServiceManager .addService (Context .ALARM_SERVICE , alarm );
这个操作在系统启动时完成,由 ServiceManager 负责创建服务进程并运行之。所以我们要做的事就是实现一个 java 服务,并将其添加到这里并由系统运行起来,以下是具体实现步骤:
实现自己的 java层 service
1. 在目录
frameworks/base/core/java/android/os中增加自己的 AIDL文件用来申明服务:
BelyService.aidl:
package android.os;
interface IBelyService {
/**
*
*/
int calculateSqu(int value);
}
2. 在目录
frameworks/base/services/java/com/android/server增加 service的实现文件:
BelyService.java:
package com.android.server;
import android.content.Context;
import android.os.IBelyService;
public class BelyService extends IBelyService.Stub {
public BelyService(Context context){
super();
}
public int calculateSqu(int val){
return val*val;
}
}
3. 将 java服务添加到 ServiceManager中:
BelyService bs = new BelyService(context);
ServiceManager.addService("BelyService", bs);
自此,重新编译 Android并运行,我们所创建的服务即可访问,下面是演示如何调用:
同样在 package/apps下任意创建一个应用,调用服务的方法如下:
import android.os.ServiceManager;
import android.os.IBelyService;
IBelyService bs = IBelyService.Stub.asInterface(ServiceManager.getService("BelyService"));
int ret = bs.calculateSqu(9);
上面我们使用的是 Android内部的方法来获取服务,当然也可以使用公开的 API: context.getSystemService来获取。
谢谢!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/belyxiong/archive/2010/09/10/5876000.aspx
分享到:
相关推荐
**Android Aidl基础详解** ...通过AidlDemo的实践,开发者可以深入了解Android的进程间通信机制,学会如何创建、注册和使用AIDL服务,以及处理各种数据类型。这将有助于构建更健壮、高效的应用程序。
当客户端通过AIDL接口调用服务端的方法时,调用会被序列化并传递到Binder驱动。驱动将调用转发给服务端的Binder对象,这个对象就是我们在服务端生成的`IAidlServiceStub`。服务执行完操作后,结果会被反序列化并回传...
ServiceManager是Java层获取服务的入口,客户端通过ServiceManager类的getService方法获取IBinder接口,从而与服务建立连接。 4.4 java获取实名服务 客户端通过调用ServiceManager.getService(String name)获取...
**Android 9.0 HIDL(硬件接口定义语言)简单实例** HIDL是Android系统用于在用户空间和硬件服务之间定义...这个实例不仅展示了HIDL的基本用法,也体现了Android系统与硬件服务之间的解耦设计,使得开发更加灵活高效。
- **PhoneInterfaceManager**:此类通过`ServiceManager.getService("phone")`注册为系统服务,并在构造函数中接收`PhoneApp`和`PhoneProxy`作为参数。`PhoneApp`继承自`Application`类,允许`PhoneInterfaceManager...
`ServiceManager.getService("isms")`用于获取系统服务,`ISms.Stub.asInterface()`则将返回的服务转换为`ISms`接口实例。 2. **AIDL与ISms服务**: `ISms`是一个通过AIDL定义的接口,它定义了与短信相关的操作,如...
- 当客户端需要获取某个服务时,通过`ServiceManager.getService()`,传入服务名称,ServiceManager会在其维护的Binder服务列表中查找。 3. **连接服务**: - ServiceManager返回对应服务的IBinder接口,客户端...
具体来说,`ServiceManager.getService("isms")`返回的是一个远程服务的代理对象,然后通过`ISms.Stub.asInterface()`将其转换为`ISms`接口的实例,以便进一步调用`sendText()`方法。 ##### 2. 服务对象:...
在Java层,我们可以使用AIDL(Android Interface Definition Language)定义接口,并通过Parcel对象序列化和反序列化数据。但是,如果我们需要在Native层(C/C++)中使用Binder,情况就会有所不同。通常,我们需要...
服务控制端通常是通过C++层实现并注入到Android系统的,例如在`IServiceManager`接口中声明的方法`getService`,用于获取指定名称的服务。这个过程涉及到了JNI(Java Native Interface),使得Java层和C++层能够相互...
3)将/frameworks/base/core/java/android/hardware/ IIrdaManager.aidl IrdaManager.java 四个文件复制到 /frameworks/base/core/java/android/hardware/中 4)在/frameworks/base目录,打开Android.mk文件,修改...
- **asInterface**:此方法用于将服务端的Binder对象转换为客户端所需的AIDL接口类型的对象。根据进程的不同,返回的对象也会有所不同。 - **onTransact**:此方法运行在服务端的Binder线程池中,当客户端发起跨进程...