`
anson_xu
  • 浏览: 514523 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取

阅读更多

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

分享到:
评论
1 楼 fengyuxing168 2014-05-22  
IBelyService bs = IBelyService.Stub.asInterface(ServiceManager.getService("BelyService"));这句话真的没有问题吗?

相关推荐

    AidlDemo(简单aidl的例子) Android源码.rar

    **Android Aidl基础详解** ...通过AidlDemo的实践,开发者可以深入了解Android的进程间通信机制,学会如何创建、注册和使用AIDL服务,以及处理各种数据类型。这将有助于构建更健壮、高效的应用程序。

    Binder架构-AIDL手动编写

    当客户端通过AIDL接口调用服务端的方法时,调用会被序列化并传递到Binder驱动。驱动将调用转发给服务端的Binder对象,这个对象就是我们在服务端生成的`IAidlServiceStub`。服务执行完操作后,结果会被反序列化并回传...

    android Binder 分析

    ServiceManager是Java层获取服务的入口,客户端通过ServiceManager类的getService方法获取IBinder接口,从而与服务建立连接。 4.4 java获取实名服务 客户端通过调用ServiceManager.getService(String name)获取...

    android 9.0 hidl 简单实例sample.rar

    **Android 9.0 HIDL(硬件接口定义语言)简单实例** HIDL是Android系统用于在用户空间和硬件服务之间定义...这个实例不仅展示了HIDL的基本用法,也体现了Android系统与硬件服务之间的解耦设计,使得开发更加灵活高效。

    Android平台呼叫流程框架分析

    - **PhoneInterfaceManager**:此类通过`ServiceManager.getService("phone")`注册为系统服务,并在构造函数中接收`PhoneApp`和`PhoneProxy`作为参数。`PhoneApp`继承自`Application`类,允许`PhoneInterfaceManager...

    Android 2.3发短信详细流程.docx

    `ServiceManager.getService("isms")`用于获取系统服务,`ISms.Stub.asInterface()`则将返回的服务转换为`ISms`接口实例。 2. **AIDL与ISms服务**: `ISms`是一个通过AIDL定义的接口,它定义了与短信相关的操作,如...

    Android中Binder处理流程

    - 当客户端需要获取某个服务时,通过`ServiceManager.getService()`,传入服务名称,ServiceManager会在其维护的Binder服务列表中查找。 3. **连接服务**: - ServiceManager返回对应服务的IBinder接口,客户端...

    短信息发送流程

    具体来说,`ServiceManager.getService("isms")`返回的是一个远程服务的代理对象,然后通过`ISms.Stub.asInterface()`将其转换为`ISms`接口的实例,以便进一步调用`sendText()`方法。 ##### 2. 服务对象:...

    binderclient.rar

    在Java层,我们可以使用AIDL(Android Interface Definition Language)定义接口,并通过Parcel对象序列化和反序列化数据。但是,如果我们需要在Native层(C/C++)中使用Binder,情况就会有所不同。通常,我们需要...

    Android学习之介绍Binder的简单使用

    服务控制端通常是通过C++层实现并注入到Android系统的,例如在`IServiceManager`接口中声明的方法`getService`,用于获取指定名称的服务。这个过程涉及到了JNI(Java Native Interface),使得Java层和C++层能够相互...

    DC6008_irda_manager驱动程序和APK_20150914_1424.7z

    3)将/frameworks/base/core/java/android/hardware/ IIrdaManager.aidl IrdaManager.java 四个文件复制到 /frameworks/base/core/java/android/hardware/中 4)在/frameworks/base目录,打开Android.mk文件,修改...

    跨进程通信.pptx

    - **asInterface**:此方法用于将服务端的Binder对象转换为客户端所需的AIDL接口类型的对象。根据进程的不同,返回的对象也会有所不同。 - **onTransact**:此方法运行在服务端的Binder线程池中,当客户端发起跨进程...

Global site tag (gtag.js) - Google Analytics